Boost C++ Libraries of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

This is the documentation for an old version of Boost. Click here to view this page for the latest version.

Struct template when

boost::proto::when — A grammar element and a PrimitiveTransform that associates a transform with the grammar.


// In header: <boost/proto/transform/when.hpp>

template<typename Grammar, typename PrimitiveTransform = Grammar> 
struct when :  PrimitiveTransform {
  // types
  typedef typename Grammar::proto_base_expr proto_base_expr;


Use proto::when<> to override a grammar's default transform with a custom transform. It is for used when composing larger transforms by associating smaller transforms with individual rules in your grammar, as in the following transform which counts the number of terminals in an expression.

// Count the terminals in an expression tree.
// Must be invoked with initial state == mpl::int_<0>().
struct CountLeaves :
    proto::when<proto::terminal<proto::_>, mpl::next<proto::_state>()>,
    proto::otherwise<proto::fold<proto::_, proto::_state, CountLeaves> >

In proto::when<G, T>, when T is a class type it is a PrimitiveTransform and the following equivalencies hold:

  • boost::result_of<proto::when<G,T>(E,S,V)>::type is the same as boost::result_of<T(E,S,V)>::type.

  • proto::when<G,T>()(e,s,v) is the same as T()(e,s,v).