Boost logo

Boost Users :

Subject: Re: [Boost-users] [Proto] Functions returning an expression
From: Joel Falcou (joel.falcou_at_[hidden])
Date: 2008-11-14 15:14:50


Eric Niebler a écrit :
> Joel Falcou wrote:
>> Eric Niebler a écrit :
>>> Why don't you want to use make_expr? That's what it's for. You build
>>> the return type with proto::result_of::make_expr, and call
>>> proto::make_expr() from with f().
>>>
>> I have nothing against make_expr for building a single node of the
>> expression.
>> I have tons of such function combining long chains of call and i
>> don't thin chaing large amount of make_expr is good.
>>
>> Is there a way to use BOOST_TYPEOF with proto ?
>> So maybe i can write :
>>
>> BOOST_TYPEOF(
>> (vec_expr<A>()+vec_expr<B>())/(vec_expr<A>()-vec_expr<B>())
>> f( ... ) {}
>
> You could use BOOST_TYPEOF, but you need to be careful about lifetime
> management. The resulting expression will have references to temporary
> objects, and returning it without deep-copying it first will cause
> dangling references.
>
> You could get some mileage from the operator metafunctions. Eg:
>
> template<typename A, typename B>
> vec_expr<
> typename proto::divides<
> vec_expr<
> typename proto::plus<
> vec_expr<A> const &,
> vec_expr<B> const &
> >::type
> >,
> vec_expr<
> typename proto::minus<
> vec_expr<A> const &,
> vec_expr<B> const &
> >::type
> >
> >::type
> > const
> f(vec_expr<A> const &a, vec_expr<B> const &b)
> {
> vec_expr<
> typename proto::divides<
> vec_expr<
> typename proto::plus<
> vec_expr<A> const &,
> vec_expr<B> const &
> >::type
> >,
> vec_expr<
> typename proto::minus<
> vec_expr<A> const &,
> vec_expr<B> const &
> >::type
> >
> >::type
> > that = {{{{a,b}},{{a,b}}}}; // assumes vec_expr uses
> // BOOST_PROTO_EXTENDS
> return that;
> }
>
> This way you can be very explicit about what nodes are stored by
> reference and which are by value. I don't see this as better than
> make_expr, though, which is IMO your best bet.
>
OK, i've just skimmed through my files and well, the solution can't be
other thign than make_expr due to this lifetime problem.
Thanks for the head up though

-- 
___________________________________________
Joel Falcou - Assistant Professor
PARALL Team - LRI - Universite Paris Sud XI
Tel : (+33)1 69 15 66 35

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