|
Boost : |
From: Cédric Venet (cedric.venet_at_[hidden])
Date: 2008-03-10 17:10:49
Hi,
I decided to try to write a small vector library with proto to test it.
The following worked without problem (I will use extend further on but at
the moment the as_expr are needed)
proto::display_expr( proto::as_expr(x)+proto::as_expr(y)*proto::as_expr(z)
, std::cout );
I then added
struct fastvec_reduction_tag {};
struct sum_ {};
template<typename A>
typename proto::result_of::make_expr<
fastvec_reduction_tag
// , MixedDomain
, sum_ const
, A const &
>::type sum(A const &a) {
return proto::make_expr<fastvec_reduction_tag/*, MixedDomain*/>(sum_(),
boost::ref(a));
}
Which work well
proto::display_expr( sum(x) , std::cout );
And now, I would like to create a "function" dot(x,y) which expand to
sum(x*y).
I tried:
template<typename A, typename B>
typename proto::result_of::make_expr<
fastvec_reduction_tag
// , MixedDomain
, sum_ const
, BOOST_TYPEOF(boost::ref(proto::as_expr(A())*proto::as_expr(B())))
> const &
>::type dot(A const &a, B const &b) {
return proto::make_expr<fastvec_reduction_tag/*, MixedDomain*/>(sum_(),
boost::ref(
proto::as_expr(a)*proto::as_expr(b)
));
}
Which compile but fail at runtime when I do
proto::display_expr( dot(x,y) , std::cout );
(it call << on an invalid vector (type of x and y)).
Is there a ways to create the tree for sum(x*y) directly or should I use a
transform (create a tree with a dot tag and then transform it with proto)?
The page 'users_guide\expression_construction\construction_utils.html' seems
very complete, but hard to understand how to put it in practice, perhaps you
could link it to some use in the example.
Regards,
-- Cédric
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk