Boost logo

Boost Users :

Subject: Re: [Boost-users] [units] meta_multiply units?
From: Matthias Schabel (boost_at_[hidden])
Date: 2009-09-11 13:36:39


> Hello,
>
> I cannot seem to figure out how to make a composite unit
> out of two existing units from the same system. For example,
> say I have a functor F which takes an argument of type
>
> F::arg_type = quantity<time>
>
> and returns a value of type
>
> F::ret_type = quantity<velocity>
>
> Now I want to write an integration function, which should
> return the correct type, something like
>
> template<class F>
> F::ret_type*F::arg_type // only conceptually
> integrate(F& f, typename F::arg_type a, typename F::arg_type b);
>
> so instantiating this with the above functor should produce a
> return type quantity<time*velocity==length>. How can I combine
> F::arg_type and F::ret_type to produce the correct return type
> for the function template?

#include <boost/units/quantity.hpp>
#include <boost/units/systems/si.hpp>

using namespace boost::units;

// functor for velocity as a function of time
struct F
{
        typedef quantity<si::time> arg_type;
        typedef quantity<si::velocity> ret_type;
        
        // constant velocity
        ret_type operator()(arg_type t) const { return 1.0*si::meters/
si::second; }
};

template<class F>
typename multiply_typeof_helper<typename
F::arg_type::unit_type,typename F::arg_type::unit_type>::type
integrate(F& f,typename F::arg_type a,typename F::arg_type b)
{
        // put actual integration algorithm here...
        return F(b)*(b-a);
}

int main(void)
{
        return 0;
}

There are corresponding xxx_typeof_helper functions for add, subtract,
divide, pow, and root... Of course, if you're using a compiler that
fully supports typeof, these shenanigans shouldn't be necessary at all.

Matthias



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net