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

Actors in Detail

Boost , Chapter 1. Phoenix 3.2.0 , Inside Phoenix

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
Actor

Основная идея – это<Actor>.<Actor>является моделью концепцииобъекта полиморфной функции(которая может принимать аргументы от 0 до N (где N является предопределенным максимумом).

<Actor>содержит действительную экспрессию Феникса, вызов одной из функций оператора вызова перегружает, запускает процесс оценки.

[Note] Note

Вы можете установить<BOOST_PHOENIX_LIMIT>, предопределенный максимум, который может взять актер. По умолчанию<BOOST_PHOENIX_LIMIT>устанавливается на 10.

Класс шаблонов<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

выражение

Семантика

<actor(arg0, arg1, ...,argN)>

Функция вызова операторов для начала оценки

<boost::result_of<Actor<Expr>(Arg0, Arg1, ...,ArgN)>::type>

Результаты оценки

<result_of::actor<Expr, Arg0, Arg1, ...,ArgN>::type>

Результаты оценки


Function Call Operators

Есть операторы вызовов 2*N для аргументов от 0 до N (N ==<BOOST_PHOENIX_LIMIT>). Актерский класс принимает аргументы и направляет аргументы в действие по оценке по умолчанию.

Кроме того, существуют операторы вызовов функций, принимающие перестановки ссылок const и non-const. Эти операторы созданы для всех N<=<BOOST_PHOENIX_PERFECT_FORWARD_LIMIT>(по умолчанию 3).

[Note] Note

Проблемная функция переадресации

Существует известная проблема с текущим C++ под названием «Проблема пересылки функций». Проблема в том, что при наличии произвольной функции<F>, используя текущие правила языка C++, нельзя создать пересылающую функцию<FF>, которая прозрачно принимает аргументы<F>.

Context

На вызове функции актера, прежде чем вызвать функцию оценки, актер создал контекст. Эта часть состоит из<Environment>и<Action>частей. Они содержат всю информацию, необходимую для оценки данного выражения.

Table 1.10. Context Concept Requirements

выражение

Семантика

<result_of::context<Env, Actions>::type>

Тип контекста

<context(e, a)>

Контекст, содержащий среду<e>и действия<a>

<result_of::env<Context>::type>

Тип окружающей среды

<env(ctx)>

Окружающая среда

<result_of::actions<Context>::type>

Тип содержащихся действий

<actions(ctx)>

Действия


Environment

Окружающая среда — это модельслучайной последовательности доступа.

Аргументы, переданные оператору вызова функции актера, собираются внутри Окружающей среды:

Другие части библиотеки (например, модуль области действия) расширяют концепцию<Environment>для хранения другой информации, такой как локальные переменные и т.д.

Actions

Действия — это часть Феникса, которая отвечает за то, чтобы дать реальным выражениям определенное поведение. Во время прохождения Дерева экспрессии Феникса эти действия называются всякий раз, когда в грамматике совпадает определенное правило.

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>
    {};
};

Для получения дополнительной информации о том, как использовать класс действий по умолчанию и как прикрепить пользовательские действия к процессу оценки, см.подробнее о действиях.

Evaluation
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()));
}
result_of::actor

По причинам симметрии к семейству<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;
    };
}

PrevUpHomeNext

Статья Actors in Detail раздела Chapter 1. Phoenix 3.2.0 Inside Phoenix может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Inside Phoenix ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 20:39:40/0.0099260807037354/1