A Boolean metafunction that evaluates whether a given expression type matches a grammar. More...
#include <proto_fwd.hpp>


A Boolean metafunction that evaluates whether a given expression type matches a grammar.
matches<Expr,Grammar> inherits (indirectly) from mpl::true_ if Expr::proto_grammar matches Grammar::proto_grammar, and from mpl::false_ otherwise.
Non-terminal expressions are matched against a grammar according to the following rules:
_, matches any expression. expr<AT, listN<A0,A1,...An> > matches a grammar expr<BT, listN<B0,B1,...Bn> > if BT is _ or AT, and if Ax matches Bx for each x in [0,n). expr<AT, listN<A0,...An,U0,...Um> > matches a grammar expr<BT, listM<B0,...Bn,vararg<V> > > if BT is _ or AT, and if Ax matches Bx for each x in [0,n) and if Ux matches V for each x in [0,m). E matches or_<B0,B1,...Bn> if E matches some Bx for x in [0,n). E matches and_<B0,B1,...Bn> if E matches all Bx for x in [0,n). E matches if_<T,U,V> if boost::result_of<when<_,T>(E,int,int)>::type::value is true and E matches U; or, if boost::result_of<when<_,T>(E,int,int)>::type::value is false and E matches V. (Note: U defaults to _ and V defaults to not_<_>.) E matches not_<T> if E does not match T. E matches switch_<C,T> if E matches C::case_<boost::result_of<T(E)>::type>. (Note: T defaults to tag_of<_>().)A terminal expression expr<AT,term<A> > matches a grammar expr<BT,term<B> > if BT is AT or proto::_ and if one of the following is true:
B is the wildcard pattern, _ A is B A is B & A is B const & B is exact<A> B is convertible_to<X> and is_convertible<A,X>value is true. A is X[M] or X(&)[M] and B is X[proto::N]. A is X(&)[M] and B is X(&)[proto::N]. A is X[M] or X(&)[M] and B is X*. B lambda-matches A (see below).A type B lambda-matches A if one of the following is true:
B is A B is the wildcard pattern, _ B is T<B0,B1,...Bn> and A is T<A0,A1,...An> and for each x in [0,n), Ax and Bx are types such that Ax lambda-matches Bx