![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
BindersBoost , ,
Бывают случаи, когда желательно связать простой функтор, функцию, функцию члена или переменную члена для отложенной оценки. Это можно сделать с помощью обязательных условий, предусмотренных ниже. Существуют шаблонные классы:
Эти классы шаблонов являются специализированными классами ленивых функций для функторов, указателей функций, указателей функций членов и указателей переменных членов соответственно. Это подклассы класса ленивых функций (см. функции). Каждый из них имеет соответствующую перегруженную функцию связывания (x). Каждая функция связывания (x) генерирует подходящий связующий объект. Пример, приведенная функция foo:
Вот как связана функция foo:
Это связывает экспрессию с ленивой функцией (см. функции), которая лениво оценивается. Это связывающее выражение также эквивалентно:
Параметр шаблона функции_ptr - это тип возврата и аргумента фактической подписи функции, которая должна быть связана слева направо. Примеры:
Либо связывание (&foo_) и его эквивалентное foo теперь можно использовать таким же образом, как используется ленивая функция (см. функции):
или
Последнее, конечно, следует за функцией вызова C/C++ и гораздо проще понять. Теперь это полноценная ленивая функция, которую, наконец, можно оценить по другому вызову функции. Второй вызов функции вызовет фактическую функцию foo:
Выберите "4". Связывание функторов и функций участников может быть выполнено аналогичным образом. Вот как связать функтор (например, std::plus
или
Опять же, это полноценные ленивые функции. В этом случае, в отличие от первого примера, следует ожидать 2 аргумента (std::plus
Функция связанного члена принимает в качестве первого аргумента указатель или ссылку на объект. Например, учитывая:
Функция члена foo xyz может быть связана с:
или member_function_ptr Шаблон параметра Member_function_ptr - это возврат, класс и типы аргументов фактической подписи связанной функции, читаемой слева направо:
Обратите внимание, что член_функция_ptr ожидает, что первым аргументом будет указатель или ссылка на объект. И объект (ссылка или указатель), и аргументы могут быть лениво связаны. Примеры:
Напоминаем, что var(obj) должен использоваться для вызова неконст-членных функций. Например, если xyz был объявлен как:
указатель или ссылка на объект также должны быть неконстными, поскольку лениво связанные аргументы по умолчанию хранятся в виде значения конст (см. класс переменных в примитивах).
arg1..argN уже неявно изменчивы. Нет необходимости заворачивать arg1..argN в вар. Это ошибка, чтобы сделать это:
Наконец, переменные могут быть связаны так же, как функции членов. Например, учитывая:
xyz::v может быть связан как:
или
Шаблон параметра member_var_ptr - это тип переменной, за которой следует класс:
Так же, как член_функция_ptr, член_var_ptr также ожидает, что первым аргументом будет указатель или ссылка на объект. И объект (ссылка или указатель), и аргументы могут быть лениво связаны. Как и связующие функции членов, var(obj) должен использоваться для доступа к переменным, не входящим в состав. Примеры:
Еще раз напомним, что связующие являются мономорфными. Этот уровень обеспечивается только для совместимости с существующим кодом, таким как предварительно написанные STL-функторы и устаревшие API. Вместо связывания функций или функторов предпочтительным методом является запись истинных родовых и полиморфных ленивых функций. Однако, поскольку большую часть времени мы имеем дело с адаптацией исходного кода, связующие действительно незаменимы.
Copyright © 2001-2002 Joel de Guzman Статья Binders раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
|||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |