Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Struct template pass_through

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Reference

Boost C++ Libraries

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

PrevUpHomeNext

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

// In header: <boost/proto/transform/pass_through.hpp>
template<typename Grammar, typename Domain = proto::deduce_domain> 
struct pass_through :  proto::transform< pass_through<Grammar, Domain> > {
  // member classes/structs/unions
  template<typename Expr, typename State, typename Data> 
  struct impl :  proto::transform_impl<Expr, State, Data> {
    // types
    typedef typename proto::result_of::child_c<Grammar, N>::type       GN;           // For each N in [0,Expr arity), for exposition only
    typedef typename proto::result_of::child_c<Expr, N>::type          EN;           // For each N in [0,Expr arity), for exposition only
    typedef typename boost::result_of<GN(EN,State,Data)>::type         RN;           // For each N in [0,Expr arity), for exposition only
    typedef typename Expr::proto_tag                                   T;            // For exposition only
    typedef boost::is_same<Domain, deduce_domain>                      Deduce;       // For exposition only
    typedef typename Expr::proto_domain                                DD;           // For exposition only
    typedef typename mpl::if_<Deduce, DD, Domain>::type                D;            // For exposition only
    typedef typename D::proto_generator                                G;            // For exposition only
    typedef proto::listN<R0,...RN>                                     A;            // For exposition only
    typedef proto::expr<T, A>                                          E;            // For exposition only
    typedef proto::basic_expr<T, A>                                    BE;           // For exposition only
    typedef typename mpl::if_<proto::wants_basic_expr<G>, BE, E>::type expr_type;    // For exposition only
    typedef typename boost::result_of<D(expr_type)>::type              result_type;
    // public member functions
    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 в выражении ДП.

// This transform finds all float terminals in an expression and promotes
// them to doubles.
struct Promote :
  proto::or_<
    proto::when<proto::terminal<float>, proto::terminal<double>::type(proto::_value) >,
    // terminal<>'s default transform is a no-op:
    proto::terminal<proto::_>,
    // nary_expr<> has a pass_through<> transform:
    proto::nary_expr<proto::_, proto::vararg<Promote> >
  >
{};


PrevUpHomeNext

Статья Struct template pass_through раздела The Boost C++ Libraries BoostBook Documentation Subset Reference может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Reference ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 03:00:23/0.0041940212249756/0