![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Actors in DetailBoost , Chapter 1. Phoenix 3.2.0 , Inside Phoenix
|
![]() |
Note |
---|---|
Вы можете установить< |
Класс шаблонов<actor
>моделирует концепцию<Actor
>:
template <typename Expr> struct actor { template <typename Sig> struct result; typename result_of::actor<Expr>::type operator()() const; template <typename T0> typename result_of::actor<Expr, T0 &>::type operator()(T0& _0) const; template <typename T0> typename result_of::actor<Expr, T0 const &>::type operator()(T0 const & _0) const; //... };
Table 1.9. Actor Concept Requirements
выражение |
Семантика |
---|---|
< |
Функция вызова операторов для начала оценки |
< |
Результаты оценки |
< |
Результаты оценки |
Есть операторы вызовов 2*N для аргументов от 0 до N (N ==<BOOST_PHOENIX_LIMIT
>). Актерский класс принимает аргументы и направляет аргументы в действие по оценке по умолчанию.
Кроме того, существуют операторы вызовов функций, принимающие перестановки ссылок const и non-const. Эти операторы созданы для всех N<=<BOOST_PHOENIX_PERFECT_FORWARD_LIMIT
>(по умолчанию 3).
![]() |
Note |
---|---|
Проблемная функция переадресации Существует известная проблема с текущим C++ под названием «Проблема пересылки функций». Проблема в том, что при наличии произвольной функции< |
На вызове функции актера, прежде чем вызвать функцию оценки, актер создал контекст. Эта часть состоит из<Environment
>и<Action
>частей. Они содержат всю информацию, необходимую для оценки данного выражения.
Table 1.10. Context Concept Requirements
выражение |
Семантика |
---|---|
< |
Тип контекста |
< |
Контекст, содержащий среду< |
< |
Тип окружающей среды |
< |
Окружающая среда |
< |
Тип содержащихся действий |
< |
Действия |
Окружающая среда — это модельслучайной последовательности доступа.
Аргументы, переданные оператору вызова функции актера, собираются внутри Окружающей среды:
Другие части библиотеки (например, модуль области действия) расширяют концепцию<Environment
>для хранения другой информации, такой как локальные переменные и т.д.
Действия — это часть Феникса, которая отвечает за то, чтобы дать реальным выражениям определенное поведение. Во время прохождения Дерева экспрессии Феникса эти действия называются всякий раз, когда в грамматике совпадает определенное правило.
struct actions { template <typename Rule> struct when; };
<when
>Ветхий Завет содержитПротопримитивное преобразование. Не беспокойтесь, вам не нужно учитьсяBoost.Protoпока! Phoenix предоставляет некоторые обертки, которые позволяют вам определять простые действия без необходимости углубляться в прото.
Корабли Phoenix с предопределенным классом<default_actions
>, который оценивает выражения с помощью семантики C++:
struct default_actions { template <typename Rule, typename Dummy = void> struct when : proto::_default<meta_grammar> {}; };
Для получения дополнительной информации о том, как использовать класс действий по умолчанию и как прикрепить пользовательские действия к процессу оценки, см.подробнее о действиях.
struct evaluator { template <typename Expr, typename Context> unspecified operator()(Expr &, Context &); }; evaluator const eval = {};
Оценка выражения Феникса начинается с вызова оператора вызова функции<evaluator
>.
Оценщик называется оператором функции<actor
>перегрузкой после создания контекста. Для справки, вот типичный<actor::operator()
>, который принимает два аргумента:
template <typename T0, typename T1> typename result_of::actor<Expr, T0 &, T1 &>::type operator()(T0 &t0, T1 &t1) const { fusion::vector2<T0 &, T1 &> env(t0, t1); return eval(*this, context(env, default_actions())); }
По причинам симметрии к семейству<actor::operator()
>существует специальная метафункция, используемая для расчета типа результата актера<result_of::actor
>. Эта метафункция позволяет нам непосредственно определять типы параметров, которые должны быть переданы функции<actor::operator()
>. Вот типичный<actor_result
>, который принимает два аргумента:
namespace result_of { template <typename Expr, typename T0, typename T1> struct actor { typedef fusion::vector2<T0, T1> env_tpe; typedef typename result_of::context<env_type, default_actions>::type ctx_type typedef typename boost::result_of<evaluator(Expr const&, ctx_type)>::type type; }; }
Статья Actors in Detail раздела Chapter 1. Phoenix 3.2.0 Inside Phoenix может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Inside Phoenix ::
реклама |