|
Boost Users : |
Subject: Re: [Boost-users] [Proto] Functions returning an expression
From: Eric Niebler (eric_at_[hidden])
Date: 2008-11-14 15:10:29
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.
-- Eric Niebler BoostPro Computing http://www.boostpro.com
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