![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
FunctionsBoost , ,
Lazy functionsЭтот класс предоставляет механизм для ленивой оценки функций. Синтактически ленивая функция выглядит как обычная функция C/C++. Функция вызов выглядит знакомо и чувствует то же самое, что и обычные функции C++. Однако, в отличие от обычных функций, фактическое выполнение функции откладывается. Например, вот примеры факториальных функций вызовов:
Эти функции автоматически связаны друг с другом в отличие от обычных указателей функций или объектов фанктора, которые должны быть четко связаны через функцию связующего звена (см. связующие). Ленивая функция работает совместно с пользователем, определенным фанктором (как обычно с оператором-членом). Разрешены только специальные формы фанкторных объектов. Это необходимо для того, чтобы обеспечить истинный полиморфизм (мономорфные функторы стиля STL и указатели функций все еще могут использоваться через связующее устройство (см. связующие). Этот специальный фанктор, как ожидается, будет иметь вложенный результат класса шаблона Существует особый случай для фанкторов, которые не принимают никаких аргументов. Такие нулевые функторы необходимы только для определения результата_типа typedef, который отражает тип возврата его оператора(). Вот пример простого фанктора, который вычисляет факториал числа:
Как видно, фанктор полиморфен. Его аргументы и тип возврата не привязаны к конкретному типу. Пример выше, например, может обрабатывать любой тип, если он может выполнять необходимые операции (т.е. < =, * и -). Теперь мы можем объявить и обобщить ленивую «фабричальную» функцию:
Ссылка на ленивую функцию «фабричная» не сразу выполняет фанктор факториал_impl. Вместо этого создается и возвращается к звонителю. Пример:
не более чем возвратить композит. Второй вызов функции будет вызывать фактическую факториальную функцию. Пример:
будет распечатать "24 " . Обратите внимание, что в некоторых случаях (например, для функторов с состоянием) экземпляр функтора может быть передан конструктору. Пример:
где ftor является примером факториального_impl (это не обязательно в этом случае, поскольку факториал - простой апатридный фанктор). Будьте осторожны, хотя при использовании функторов с состоянием, потому что функторы принимаются по стоимости. Лучше всего держать данные под манипулированием фурктора за пределами самого грибка и держать ссылку на эти данные внутри функтора. Кроме того, лучше всего держать фанкторы как можно меньше.
Copyright © 2001-2002 Joel de Guzman Статья Functions раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
|||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |