Boost logo

Boost :

From: Eric Niebler (eric_at_[hidden])
Date: 2007-06-01 10:36:29

Larry Evans wrote:
> Hi Eric,
> I need a context with something like the following methods:
> template< typename Tag, typename Left, typename Right >
> result_type operator()(expr<Tag, Left, Right> const &expr) const
> {
> std::cout<<std::setw(indent)
> <<""<<"binary_expr:"<<expr.get_instance()<<"\n";
> indent+=2;
> proto::eval(left, *this);
> proto::eval(right, *this);
> indent-=2;
> }
> where the expression tree node argument remains "packaged":
> (expr<Tag, Left, Right> const &expr)
> in contrast to the unpacked version:
> (Tag, Left const &left, Right const &right)

Sure. Only context types derived from callable_context get unpacked
nodes like that. If you don't inherit from callable_context, you'll get
the whole node without any modification. The interface is a bit
different, though. You'll need something like:

struct my_context
     template<typename Expr>
     struct eval
         typedef ... result_type;
         operator()(Expr &expr, my_context &ctx) const
             return ...;

If you want to handle binary nodes specially, you would define the eval
member template as:

     template<typename Expr, long Arity = Expr::arity::value>
     struct eval

and then partially specialize for binary nodes:

     template<typename Expr>
     struct eval<Expr, 2>


Eric Niebler
Boost Consulting

Boost list run by bdawes at, gregod at, cpdaniel at, john at