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

Composites revisited

Boost , ,

Composites revisited

Композит - это актерский базовый класс, состоящий из нуля или более актеров (см. актер) и операции. Композит сам по себе является актерским суперклассом и соответствует ожидаемому концептуальному интерфейсу. Его эйвальная функция разворачивает искаженные фактические аргументы, ссылаясь на функцию эйвального члена каждого из актеров. Результаты каждого из них затем передаются в качестве аргументов в пользу операции. Специализации предоставляются для композитов, которые обрабатывают различное количество актеров от нуля до N, где N является предопределенным максимумом.

Схематически:

    actor0.eval(tupled_args) --> arg0 --> |
    actor1.eval(tupled_args) --> arg1 --> |
    actor2.eval(tupled_args) --> arg3 --> | --> operation(arg0...argN)
    ...                                   |
    actorN.eval(tupled_args) --> argN --> |

Вот типичный пример функции эйвального элемента композита для 2-актерного композита:

    template <typename TupleT>
    typename actor_result<self_t, TupleT>::type
    eval(TupleT const& args) const
    {
        typename actor_result<A0, TupleT>::type r0 = a0.eval(args);
        typename actor_result<A1, TupleT>::type r1 = a1.eval(args);
        return op(r0, r1);
    }

где self_t — тип «я» композита, TupleT «args» — это аргументы, переданные актеру (см. актер), а op — операция, связанная с композитом. r0 и r1 — это фактические аргументы, не замешанные в «аргах» и предварительно обработанные субъектами композита, которые затем передаются в операцию «операция».

Операция может быть любым подходящим функтором, который может принять аргументы, переданные композитом. Операция должна иметь оператора-члена(), который осуществляет фактическую операцию. Должна существовать одно-единственная переписка между субъектами составной части и аргументами оператора-члена операции.

Ожидается, что операция также будет иметь вложенный результат класса шаблонов. Результат класса вложенных шаблонов должен иметь тип DEF, который отражает тип возврата оператора (участника). Это, по сути, тип компьютера, который отвечает на вопрос метапрограммирования; Учитывая аргументы типа T0 ... TN, каким будет тип возврата вашего оператора? ". Есть особый случай для операций, которые не принимают никаких аргументов. Такие нулевые операции требуются только для определения типа результата, который отражает тип возврата оператора ().

Вот взгляд на то, что происходит, когда функция Эвал называется:

    tupled arguments:                 args
                                       |
                       +-------+-------+-------+-------+
                       |       |       |       |       |
                       |       |       |       |       |
    actors:         actor0  actor1  actor2  actor3..actorN
                       |       |       |       |       |
                       |       |       |       |       |
    operation:   op( arg0,   arg1,   arg2,   arg3,...argN )
                  |
                  |
    returns:      +---> operation::result<T0...TN>::type

Вот пример простой операции, которая вычисляет число:

    struct square {
        template <typename ArgT>
        struct result { typedef ArgT type; };
        template <typename ArgT>
        ArgT operator()(ArgT n) const { return n * n; }
    };

Это прекрасный пример полиморфного функтора, обсуждаемого ранее в разделе о функциях. Как мы видим, операции полиморфны. Его аргументы и тип возврата не привязаны к определенному типу. Пример выше, например, может обрабатывать любой тип ArgT, если у него есть оператор умножения.

Композиты не создаются напрямую. Вместо этого существуют мета-программы, которые косвенно создают композиты. См. операторы, связующие и функции для примеров.



Статья Composites revisited раздела может быть полезна для разработчиков на c++ и boost.




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



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


реклама


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

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