[units] unit conversion on construction in relation to argument passing
Hi,
Boost.Units offers automatic conversion (if conversion factor is
defined) on construction of variables:
quantitycgs::lengh A = 4.*cgs::centimeter;
quantitysi::length a(A);
nice! But for some reason I believe this would work for argument
functions
double f(quantitysi::length v){ return 1.;}
...
quantitycgs::lengh A = 4.*cgs::centimeter
f(A); // doesn't work! not matching function
why is this? isn't the argument of the call a sort of construction
argument for the function argument, or is more like a plain
assignment. Is there a way to force the automatic conversion of the
function call.
Or I am forced to use this other long call?
f(quantitysi::length(A));
Thanks
Alfredo
Full code:
#include
AMDG On 03/24/2011 10:04 PM, alfC wrote:
Hi, Boost.Units offers automatic conversion (if conversion factor is defined) on construction of variables:
quantitycgs::lengh A = 4.*cgs::centimeter; quantitysi::length a(A);
nice! But for some reason I believe this would work for argument functions
double f(quantitysi::length v){ return 1.;} ... quantitycgs::lengh A = 4.*cgs::centimeter f(A); // doesn't work! not matching function
why is this? isn't the argument of the call a sort of construction argument for the function argument, or is more like a plain assignment. Is there a way to force the automatic conversion of the function call.
Or I am forced to use this other long call?
f(quantitysi::length(A));
Yes. The constructor is explicit. In Christ, Steven Watanabe
nice! But for some reason I believe this would work for argument functions
double f(quantitysi::length v){ return 1.;} ... quantitycgs::lengh A = 4.*cgs::centimeter f(A); // doesn't work! not matching function
why is this? isn't the argument of the call a sort of construction argument for the function argument, or is more like a plain assignment. Is there a way to force the automatic conversion of the function call.
Or I am forced to use this other long call?
f(quantitysi::length(A));
Yes. The constructor is explicit.
Or you can write it as a template function that takes any argument that is a quantity of length :
#include <iostream>
#include
On Mar 25, 9:46 am, Matthias Schabel
nice! But for some reason I believe this would work for argument functions
double f(quantitysi::length v){ return 1.;} ... quantitycgs::lengh A = 4.*cgs::centimeter f(A); // doesn't work! not matching function
why is this? isn't the argument of the call a sort of construction argument for the function argument, or is more like a plain assignment. Is there a way to force the automatic conversion of the function call.
Or I am forced to use this other long call?
f(quantitysi::length(A));
Yes. The constructor is explicit.
thanks for the clarification
Or you can write it as a template function that takes any argument that is a quantity of length : [...code...]
Thank you for the suggestion, the problem is that a nice looking function such as void f( quantity<volume> v, quantity<temperature> t, quantity<length> l ){ ... use v, l, t in a given controlled set of units } transfroms into this mess, template< class VolumeUnit, class TemperatureUnit, class LengthUnit
void f( quantity<VolumeUnit> v_, quantity<TemperatureUnit> t_, quantity<LengthUnit> l_ ){ quantity<volume> v(v); quantity<temperature> t(t_); quantity<length> l(l_); ... use v, l, t in a given controlled set of unit }
just to obtain the same effect. and that without even static asserting that XXXUnit is_unit. For sometime I agreed that implicit construction was a bad idea because of uncontrolled unit conversion but in the light of the applications (i.e. real life code) I now think that it can be a good idea instead. The uncontrolled conversion can still be tamed by the (un)definition of conversion factors.
On 3/25/2011 10:40 AM, alfC wrote:
On Mar 25, 9:46 am, Matthias Schabel
wrote: nice! But for some reason I believe this would work for argument functions
double f(quantitysi::length v){ return 1.;} ... quantitycgs::lengh A = 4.*cgs::centimeter f(A); // doesn't work! not matching function
why is this? isn't the argument of the call a sort of construction argument for the function argument, or is more like a plain assignment. Is there a way to force the automatic conversion of the function call.
Or I am forced to use this other long call?
f(quantitysi::length(A));
Yes. The constructor is explicit.
thanks for the clarification
Or you can write it as a template function that takes any argument that is a quantity of length : [...code...]
Thank you for the suggestion, the problem is that a nice looking function such as
void f( quantity<volume> v, quantity<temperature> t, quantity<length> l ){ ... use v, l, t in a given controlled set of units }
transfroms into this mess,
template< class VolumeUnit, class TemperatureUnit, class LengthUnit
void f( quantity<VolumeUnit> v_, quantity<TemperatureUnit> t_, quantity<LengthUnit> l_ ){ quantity<volume> v(v); quantity<temperature> t(t_); quantity<length> l(l_); ... use v, l, t in a given controlled set of unit }
just to obtain the same effect. and that without even static asserting that XXXUnit is_unit.
Not usually. If your equations are dimensionally coherent, and not
empirical, you can generally do without a lot of what you just showed.
For example, one might be tempted to write the head/pressure conversion as:
quantitysi::pressure head_to_press( quantitysi::length head
, quantitysi::mass_density den )
{
quantitysi::acceleration g = 9.80665 * si::meters_per_second_squared
return head * den * g;
}
All you really need to do though is:
template < typename System, typename T >
quantity< unit
participants (4)
-
alfC
-
Matthias Schabel
-
Noah Roberts
-
Steven Watanabe