boost::proto::_ — 一个通配符语法元素,可以匹配任何表达式,并且一个转换器,返回当前表达式不变。
// In header: <boost/proto/matches.hpp> struct _ : proto::transform<_> { // types typedef _ proto_grammar; // member classes/structs/unions template<typename Expr, typename State, typename Data> struct impl : proto::transform_impl<Expr, State, Data> { // types typedef Expr result_type; // public member functions Expr operator()(typename impl::expr_param, typename impl::state_param, typename impl::data_param) const; }; };
通配符类型 proto::_
是一个语法元素,使得 proto::matches<E, proto::_>::value
对于任何表达式类型 E
均为 true
。
通配符也可以用作匹配终结符时的模板参数占位符。例如,以下是一个可以匹配任何 std::complex<>
终结符的语法
BOOST_MPL_ASSERT(( proto::matches< proto::terminal<std::complex<double> >::type, proto::terminal<std::complex< proto::_ > > > ));
当用作转换器时,proto::_
返回当前表达式不变。例如,在以下示例中,proto::_
与 proto::fold<>
转换器一起使用,以折叠节点的子节点
struct CountChildren : proto::or_< // Terminals have no children proto::when<proto::terminal<proto::_>, mpl::int_<0>()>, // Use proto::fold<> to count the children of non-terminals proto::otherwise< proto::fold< proto::_, // <-- fold the current expression mpl::int_<0>(), mpl::plus<proto::_state, mpl::int_<1> >() > > > {};