Заголовокfunctional.hppобеспечивает улучшенные версии обоих адаптеров указателей функций от C++. Стандартная библиотека (§20.3.7):
pointer_to_unary_function
pointer_to_binary_function
А также соответствующий шаблон функции помощника:
ptr_fun
Тем не менее, вам не нужно использовать адаптеры в сочетании с адаптерами в этой библиотеке из-за использования намипризнаков объекта функции.. Однако вам придется использовать их, если ваша реализация не работает должным образом с нашими классами признаков (из-за отсутствия частичной специализации) или если вы хотите использовать адаптер функциональных объектов от третьей стороны.
Usage
Если вам нужно использовать эти адаптеры, использование идентично стандартным адаптерам указателей функций. Например,
Обратите внимание, однако, что эта библиотека содержит расширенныеотрицатели, которые поддерживают функции объектов, поэтому строка выше может быть написана одинаково.
std::vector<std::string>::iterator it
= std::find_if(c.begin(), c.end(), boost::not1(bad));
Argument Types
Стандарт определяетpointer_to_unary_function, как это (§20.3.8 ¶2):
template <class Arg, class Result>
class pointer_to_unary_function : public unary_function<Arg, Result> {
public:
explicit pointer_to_unary_function(Result (* f)(Arg));
Result operator()(Arg x) const;
};
Обратите внимание, что аргумент оператору()является точно таким же типом аргумента для обернутой функции. Если это тип значения, аргумент будет передан по значению и скопирован дважды.pointer_to_binary_functionСхожая проблема.
Однако, если бы мы попытались устранить эту неэффективность, объявив аргументconst Arg&, то, если бы Arg был эталонным типом, у нас была бы ссылка на ссылку, которая в настоящее время является незаконной (но см.Вопрос о базовом языке C++ No 106).
Мы хотим, чтобыбыло принято решение.зависит от того, является ли аргумент обернутой функции ссылкой. Если это ссылка, мы хотим объявить ее простоАрг; если это значение, мы хотим объявить егоconst Арг &.
Шаблон класса Boostcall_traitsсодержитparam_typetypedef, который использует частичную специализацию для принятия именно этого решения. Объявивоператора
Result operator()(typename call_traits<Arg>::param_type x) const
Мы достигаем желаемого результата – повышаем эффективность без создания ссылок на ссылки.
Limitations
Шаблон черт вызова, используемый для реализации этого улучшения, опирается на частичную специализацию, поэтому это улучшение доступно только на компиляторах, которые поддерживают эту функцию. С другими компиляторами аргумент, переданный функции, всегда будет передаваться посредством ссылки, создавая таким образом возможность ссылок на ссылки.
Пересмотрено02 Декабря 200602
December, 2006[ORIG_END] -->
Авторское право и копия; 2000 Cadenza New Zealand Ltd.
Статья Boost Function Object Adapter Library раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.