The type must be a model of .
The type must be a model of Domain.
The type must be a model of MPL Integral Constant.

An Expr represents a tagged node in an expression tree. The children of the Expr must themselves satisfy the Expr concept. The Expr has an arity representing the number of children. If the number of children is zero, the Expr also has a value. An Expr also has an associated Domain.

The tag type of the Expr.

A typelist representing either the types of the child nodes, or, if the arity of the Expr is 0, of the value of the terminal.

The arity (number of child nodes) of the Expr. `proto_arity` is an MPL Integral Constant.

A typedef for an instantiation of ``proto::basic_expr<>`` that is equivalent to Expr. Expression types are equivalent if they have the same `proto_tag`, `proto_args`, and `proto_arity`.

A typedef for an instantiation of ``proto::expr<>`` or ``proto::basic_expr<>`` that is equivalent to Expr. Expression types are equivalent if they have the same `proto_tag`, `proto_args`, and `proto_arity`.

A typedef for `Expr`.

The Domain of the Expr. `proto_domain` models Domain.

The type of the Nth child of Expr. Requires `0 == N::value || N::value < proto_arity::value`

Extracts the Nth child from this Expr. Requires `N::value < proto_arity::value`.
Extracts the value from a terminal Expr. Requires `0 == proto_arity::value`.
Returns an object of type ``proto::expr<>`` or ``proto::basic_expr<>`` that is equivalent to `e`.