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