
Joel Falcou wrote:
I have the following grammar that handles the evaluation of various matrix classes:
struct eval_xpr : bp::or_< bp::when< bp::terminal< blockbp::_,bp::_ > , _load(bp::_) > , bp::when< bp::plus< eval_xpr,eval_xpr > , bp::call< functorbp::tag::plus(eval_xpr(bp::_left ), eval_xpr(bp::_right) ) > > > {};
As you can see, the functor<T> class is a Callable object but not a primitive Transform so I use call to be able to forward the proper things to it. Currently I only play with + but I wanted to know how i can use proto::tag_of and a clever way to conserve the recursive look so it works for any operator of any tag. Basically what should I do to have :
bp::when< bp::nary_expr< bp::_, bp::vararg< eval_xpr > > , bp::call< functor< ???? >( eval_xpr(????), ???, ??? ) > >
to work for any tag and any number of parameters while typiong the less code possible. I *think* I should make a new Primitive Transform that extarct tags and arguments from bp::_expr and then perform the call to functor but doesn't this mean I have to explicitly write the code for 1,2,3 etc arguments ?
I don't have a good solution at my fingertips or the time to come up with something really whiz-bang, but you can get part of the way with the proto::lazy transform. For instance, you can handle all binary expressions with: bp::when< bp::nary_expr< bp::_, eval_xpr, eval_xpr > , bp::lazy< functor< bp::tag_of< bp::_ > >( eval_xpr(bp::_left) , eval_xpr(bp::_right) )> > This uses proto::make to turn functor< bp::tag_of< bp::_ > > into, e.g., function< proto::tag::plus > and then uses proto::call to invoke it. Hope that moves you in the right direction, -- Eric Niebler BoostPro Computing http://www.boostpro.com