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

Quick start

Boost , ,

Quick start

Чтобы получить первое представление о том, что предлагает фреймворк Phoenix, давайте начнем с примера. Мы хотим найти первое нечетное число в контейнере STL.

1) Обычно мы используем функтор или указатель функции и передаем его в функцию find_if (образец 1.cpp):

Напишите функцию:

    bool
    is_odd(int arg1)
    {
        return arg1 % 2 == 1;
    }

Передайте указатель функции в функцию find_if общего назначения STL:

    find_if(c.begin(), c.end(), &is_odd)

2) С помощью "Феникса" то же самое можно сделать непосредственно с помощью одного лайнера (sample2.cpp):

    find_if(c.begin(), c.end(), arg1 % 2 == 1)

Выражение "arg1 % 2 == 1" автоматически создает функтор с ожидаемым поведением. В FP эта неназванная функция называется лямбда-функцией. В отличие от версии указателя функции 1, которая является мономорфной (ожидает и работает только с аргументом int фиксированного типа), версия Phoenix полностью полиморфна и работает с любым контейнером (инт, двойников, комплекса и т. Д.), Пока ее элементы могут обрабатывать выражение "arg1 % 2 == 1".

3) Написать полиморфный функтор с помощью Phoenix (sample3.cpp)

    struct is_odd_ {
        template <typename ArgT>
        struct result { typedef bool type; };
        template <typename ArgT>
        bool operator()(ArgT arg1) const
        { return arg1 % 2 == 1; }
    };
    function<is_odd_> is_odd;

Выберите функцию lazy is_odd:

    find_if(c.begin(), c.end(), is_odd(arg1))

s_odd_ является фактическим функтором. Он был проксирован в функции by is_odd (не обращайте внимания на подчеркивание), что делает его ленивой функцией. is_odd_::operator() — основная функция организма. is_odd_::result - это тип компьютера, который отвечает на вопрос "Каким должен быть наш тип возврата, учитывая аргумент типа ArgT?".

Как и 2, и в отличие от 1, указателей функций или простых функторов C++, is_odd является истинным ленивым полиморфным функтором (ранг-2 полиморфный функтоид, на жаргоне FC++). Функторная версия Phoenix полностью полиморфна и работает с любым контейнером (инт, двойки, комплекс и т. д.), если ее элементы могут обрабатывать выражение "arg1 % 2 == 1". Однако, в отличие от 2, это более эффективно и имеет меньше накладных расходов, особенно при работе с гораздо более сложными функциями.

Это только верхушка айсберга. Есть более изящные вещи, которые вы можете сделать с фреймворком. Есть довольно интересные концепции, такие как полиморфные ленивые функции ранга-2, ленивые утверждения, связующие и т. Д.; Достаточно, чтобы разжечь аппетит любого, кто хочет выжать больше энергии из C++.



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




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-07-06 23:43:19/0.0069770812988281/0