Boost logo

Boost Users :

Subject: Re: [Boost-users] [fusion] deduce type of resulting vector from a transformation
From: alfC (alfredo.correa_at_[hidden])
Date: 2010-10-10 14:48:47


On Oct 10, 3:17 am, Christopher Schmidt <mr.chr.schm..._at_[hidden]>
wrote:
> Am 10.10.2010 12:02, schrieb alfC:
>
>
>
> > Hi,
>
> >  (I keep struggling with Boos.Fusion.)
>
> >  How do I deduce the type of the vector resulting from the
> > transformation of another vector?
>
> > I have a source vector of different types, e.g.
> > vector<quantity<si::length>, quantity<si::mass>,    quantity<si::time>
>
> > and I have a transformation that is well defined and returns another
> > type depending on the original type.
> > The question is how do I generate a vector type that is the result of
> > the given transformation. I though that
> > result_of::transform was the function to obtain the result but it
> > turns not because it returns a type transform_view instead of a
> > vector.
>
> > vector< ... > v1;
> > T? v2(transform(v1, transformation()));
>
> > i.e. what is the type of T as a fusion::vector as deduced from the
> > type of v1 and the transformation type? -- Thank you,    Alfredo--
>
> You can generate a vector from an arbitrary fusion sequence using the
> conversion metafunction:
>
> http://www.boost.org/doc/libs/1_44_0/libs/fusion/doc/html/fusion/cont...
>
> fusion::result_of::as_vector<
>         fusion::result_of::transform<
>                 v1,
>                 transformation
>         >::type
>
> >::type v2(fusion::transform(v1, transformation()));

Hi, thank you. I tried something like this but I keep getting an error
from the compiler.

/usr/include/boost/utility/result_of.hpp:68: error: invalid use of
incomplete type ‘struct divide::result<divide(boost::un ...

what is the problem with the following transformation? that works well
as a function but not as metafunction as called from result_of

struct divide{
        template <typename SignatureT> struct result;
        template<class Q>
        struct result<divide(Q const&)>{
                typedef typename divide_typeof_helper<Q, quantity<si::time> >::type
type;
        };
        template<typename Q>
        typename result<divide(Q const&)>::type
                operator()(Q const& q) const
        {
                return q/quantity<si::time>(1.*si::second);
        }
};

It works well as a function but not as a metafunction in the following
typedef

        typedef
                boost::fusion::result_of::as_vector<
                        boost::fusion::result_of::transform<
                                source_type,
                                divide
>::type
>::type
                result_type
        ;


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