Boost logo

Boost Users :

Subject: Re: [Boost-users] [fusion] deduce type of resulting vector from a transformation
From: Christopher Schmidt (mr.chr.schmidt_at_[hidden])
Date: 2010-10-10 15:09:08


Am 10.10.2010 20:48, schrieb alfC:
>
>
> 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
> ;

Try const-qualifying source_type in fusion::result_of::transform<...> or
add a specialization for a non-const reference argument type in
divide::result.
(fusion::transform just accepts a reference to a const-qualified
sequence whereas fusion::result_of::transform does not care about
const-qualification at all and passes the template parameter types right
down to the fusion::transform_view .)

-Christopher


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