
Replying to myself ... Eric Niebler wrote:
template<typename Expr> struct Expression<Expr, typename enable_if<matches<Expr, DoGrammar>
::type> : extends<Expr, Expression<Expr>, Domain> { explicit Expression(Expr const &expr = Expr()) : extends<Expr, Expression<Expr>, Domain>(expr) , while_(make_expr<WhileTag, Domain>(This())) {}
using extends<Expr, Expression<Expr>, Domain>::operator =; typename proto::result_of::make_expr<WhileTag, Domain, Expression const>::type while_;
private: Expression const &This() const { return *this; } };
struct DoWhileGrammar : function< unary_expr< WhileTag , DoGrammar > , Grammar > {};
Or perhaps try the following, which is a little cleaner IMO ... template<typename Expr> struct Expression<Expr , typename enable_if<matches<Expr, DoGrammar> >::type > : extends<Expr, Expression<Expr>, Domain> { explicit Expression(Expr const &expr = Expr()) : extends<Expr, Expression<Expr>, Domain>(expr) {} using extends<Expr, Expression<Expr>, Domain>::operator =; template< typename A0 > typename proto::result_of::make_expr< WhileTag, Domain, Expression const, A0 const >::type const while_(A0 const &a0) const { return make_expr<WhileTag, Domain>(*this, a0); } }; struct DoWhileGrammar : binary_expr< WhileTag , DoGrammar , Grammar > {}; HTH, -- Eric Niebler Boost Consulting www.boost-consulting.com