boost::proto::extends — For adding behaviors to a Proto expression template.
Synopsis
// In header: <boost/proto/extends.hpp>
template<typenameExpr,typename Derived,typenameDomain=proto::default_domain>structextends{// typestypedeftypenameExpr::proto_base_exprproto_base_expr;typedefDomainproto_domain;typedefDerivedproto_derived_expr;typedefextendsproto_extends;typedeftypenameproto_base_expr::proto_tagproto_tag;typedeftypenameproto_base_expr::proto_argsproto_args;typedeftypenameproto_base_expr::proto_arityproto_arity;typedeftypenameproto_base_expr::proto_grammarproto_grammar;typedeftypenameproto_base_expr::proto_childNproto_childN;// For each N in [0,max(1,proto_arity_c))// member classes/structs/unionstemplate<typename Signature>structresult{// typestypedefunspecifiedtype;};// construct/copy/destructextends();extends(extendsconst&);extends(Exprconst&);// public static functionsstaticDerivedconstmake(Exprconst&);// public member functionsproto_base_expr&proto_base();proto_base_exprconst&proto_base()const;template<typename A>unspecifiedoperator=(A&);template<typename A>unspecifiedoperator=(Aconst&);template<typename A>unspecifiedoperator=(A&)const;template<typename A>unspecifiedoperator=(Aconst&)const;template<typename A>unspecifiedoperator[](A&);template<typename A>unspecifiedoperator[](Aconst&);template<typename A>unspecifiedoperator[](A&)const;template<typename A>unspecifiedoperator[](Aconst&)const;template<typename... A>unspecifiedoperator()(Aconst&...);template<typename... A>unspecifiedoperator()(Aconst&...)const;// public data membersExprproto_expr_;// For exposition only.staticconstlongproto_arity_c;// = proto_base_expr::proto_arity_c;};
Description
Используйте<proto::extends<>>для предоставления выражений в пользовательских элементах данных вашего домена и функциях участников.
Концептуально использование<proto::extends<>>сродни наследованию от<proto::expr<>>и добавлению собственных членов. использовать<proto::extends<>>, как правило, предпочтительнее прямого наследования, потому что члены, которые были бы унаследованы от<proto::expr<>>, были бы неправы; они неправильно отрезали бы ваших дополнительных членов при построении более крупных выражений из более мелких.<proto::extends<>>автоматически дает вашим типам экспрессии соответствующие операторские перегрузки, которые сохраняют ваши доменные члены при составлении деревьев экспрессии.
Расширения выражения обычно определяются следующим образом:
template<typenameExpr>structmy_expr:proto::extends<Expr// The expression type we're extending,my_expr<Expr>// The type we're defining,my_domain// The domain associated with this expression extension>{// An expression extension is constructed from the expression// it is extending.my_expr(Exprconst&e=Expr()):my_expr::proto_extends(e){}// Unhide proto::extends::operator=// (This is only necessary if a lazy assignment operator// makes sense for your domain-specific language.)BOOST_PROTO_EXTENDS_USING_ASSIGN(my_expr)/*
... domain-specific members go here ...
*/};
Это перегруженная функция члена, предусмотренная для удобства. Он отличается от вышеуказанной функции только тем, какие аргументы он принимает.
Статья Struct template extends раздела The Boost C++ Libraries BoostBook Documentation Subset Reference может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.