From: Maurizio Vitale (mav_at_[hidden])
Date: 2007-06-01 16:34:11
Larry Evans <cppljevans_at_[hidden]> writes:
> struct xmpl_context
> explicit xmpl_context(unsigned& a_indent)
> : indent(a_indent)
> template<typename Expr, long Arity = Expr::arity::value>
> struct eval
> typedef void result_type;
> operator()(Expr &expr, xmpl_context &ctx) const
> typedef proto::tagof<Expr>::type tag_type;
> const char*tag_name=std::typeid(tag_type).name()
> for(long ichild=0; ichild<Arity; ++ichild)
> proto::eval(proto::arg_c<Expr,ichild>(expr), *this);
> unsigned& indent;
> I noticed in boost/xpressive/proto/fusion.hpp there's
> children templates, but they don't look like they'd help.
> How do I do what's implied by the above for loop?
It seems to me you're duplicating what display_expr does (in debug.hpp), but if the
question is more general and you need to do something else you can look at
proto::transform::fold (or fold_to_list if you need more persistence).
calc3.cpp shows how to use fold from the ::apply side,
// placeholders have a non-zero arity ...
placeholder_arity< proto::terminal< arg<_> > >
// Any other terminals have arity 0 ...
, proto::trans::always< proto::terminal<_>, mpl::int_<0> >
// For any non-terminals, find the arity of the children and
// take the maximum. This is recursive.
// This matches any non-terminal for which the children
// are themselves calculator expressions.
proto::nary_expr<_, proto::vararg< max_arity< CalculatorGrammar > > >
I've never used it myself, but I presume that if max_arity had a ::call member
(which in the example hasn't) then it would be called at run-time when
CalculatorGrammar::call(,,) is evaluated and the state would be the result of
calling max_arity::call on the previous element in the list of arguments.
Eric will surely correct any false information I might be inadvertently spreading...
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk