Struct template pass_through
boost::proto::pass_through — A PrimitiveTransform that transforms the child expressions of an expression
node according to the corresponding children of a Grammar. The resulting expression is in the specified domain.
Synopsis
template<typename Grammar, typename Domain = proto::deduce_domain>
struct pass_through : proto::transform< pass_through<Grammar, Domain> > {
template<typename Expr, typename State, typename Data>
struct impl : proto::transform_impl<Expr, State, Data> {
typedef typename proto::result_of::child_c<Grammar, N>::type GN;
typedef typename proto::result_of::child_c<Expr, N>::type EN;
typedef typename boost::result_of<GN(EN,State,Data)>::type RN;
typedef typename Expr::proto_tag T;
typedef boost::is_same<Domain, deduce_domain> Deduce;
typedef typename Expr::proto_domain DD;
typedef typename mpl::if_<Deduce, DD, Domain>::type D;
typedef typename D::proto_generator G;
typedef proto::listN<R0,...RN> A;
typedef proto::expr<T, A> E;
typedef proto::basic_expr<T, A> BE;
typedef typename mpl::if_<proto::wants_basic_expr<G>, BE, E>::type expr_type;
typedef typename boost::result_of<D(expr_type)>::type result_type;
result_type operator()(typename impl::expr_param,
typename impl::state_param,
typename impl::data_param) const;
};
};
Description
Учитывая грамматику, такую как прото::плюс
, тип выражения, который соответствует грамматике, такой как прото::плюс::type
, состояние S
и данные D
, результат применения прото::pass_через<Прото::2>
, преобразится
proto::plus<
boost::result_of<T0(E0, S, D)>::type,
boost::result_of<T1(E1, S, D)>::type
>::type
Вышеприведенное показывает, как ребенок трансформируется и детские выражения применяются попарно, и как результаты собираются в новый узел выражения с тем же типом тегов, что и оригинал.
Параметр шаблона Домен
определяет, в каком домене должно быть выражение. Если это прото::deduce_domain
, что является по умолчанию, то полученное выражение находится в той же области, что и выражение, переданное. В противном случае полученное выражение находится в указанном домене. Практически это означает, что генератор указанного домена используется для постобработки полученного выражения.
Четкое использование прото::pass_через<>
обычно не требуется, так как экспресс-генератор метафункций, таких как прото::плюс<>
имеют прото::pass_через<>
как их преобразование по умолчанию. Так, например, они эквивалентны:
Например, рассмотрим следующее преобразование, которое продвигает все терминалы float
в выражении ДП
.
struct Promote :
proto::or_<
proto::when<proto::terminal<float>, proto::terminal<double>::type(proto::_value) >,
proto::terminal<proto::_>,
proto::nary_expr<proto::_, proto::vararg<Promote> >
>
{};