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

Functions

Boost , ,

Functions

Lazy functions

Этот класс предоставляет механизм для ленивой оценки функций. Синтактически ленивая функция выглядит как обычная функция C/C++. Функция вызов выглядит знакомо и чувствует то же самое, что и обычные функции C++. Однако, в отличие от обычных функций, фактическое выполнение функции откладывается. Например, вот примеры факториальных функций вызовов:

    factorial(4)
    factorial(arg1)
    factorial(arg1 * 6 / factorial(var(i)))

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

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

Этот специальный фанктор, как ожидается, будет иметь вложенный результат класса шаблона (где N - число аргументов оператора-члена(). Результат класса вложенного шаблона должен иметь тип 'тип', который отражает тип возврата его оператора(). Это, по сути, тип компьютера, который отвечает на метапрограммирование вопроса " С учетом аргументов типа T0...TN, какой будет тип возврата оператора функтора? " .

Существует особый случай для фанкторов, которые не принимают никаких аргументов. Такие нулевые функторы необходимы только для определения результата_типа typedef, который отражает тип возврата его оператора().

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

    struct factorial_impl {
        template <typename Arg>
        struct result { typedef Arg type; };
        template <typename Arg>
        Arg operator()(Arg n) const
        { return (n <= 0) ? 1 : n * this->operator()(n-1); }
    };

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

Теперь мы можем объявить и обобщить ленивую «фабричальную» функцию:

    function<factorial_impl> factorial;

Ссылка на ленивую функцию «фабричная» не сразу выполняет фанктор факториал_impl. Вместо этого создается и возвращается к звонителю. Пример:

    factorial(arg1)

не более чем возвратить композит. Второй вызов функции будет вызывать фактическую факториальную функцию. Пример:

    int i = 4;
    cout << factorial(arg1)(i);

будет распечатать "24 " .

Обратите внимание, что в некоторых случаях (например, для функторов с состоянием) экземпляр функтора может быть передан конструктору. Пример:

    function<factorial_impl> factorial(ftor);

где ftor является примером факториального_impl (это не обязательно в этом случае, поскольку факториал - простой апатридный фанктор). Будьте осторожны, хотя при использовании функторов с состоянием, потому что функторы принимаются по стоимости. Лучше всего держать данные под манипулированием фурктора за пределами самого грибка и держать ссылку на эти данные внутри функтора. Кроме того, лучше всего держать фанкторы как можно меньше.



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




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-23 05:54:38/0.0064949989318848/0