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

Boost Function Object Adapter Library

Boost , ,

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Function Pointer Adapters

Заголовокfunctional.hppобеспечивает улучшенные версии обоих адаптеров указателей функций от C++. Стандартная библиотека (§20.3.7):

  • pointer_to_unary_function
  • pointer_to_binary_function

А также соответствующий шаблон функции помощника:

  • ptr_fun

Тем не менее, вам не нужно использовать адаптеры в сочетании с адаптерами в этой библиотеке из-за использования намипризнаков объекта функции.. Однако вам придется использовать их, если ваша реализация не работает должным образом с нашими классами признаков (из-за отсутствия частичной специализации) или если вы хотите использовать адаптер функциональных объектов от третьей стороны.

Usage

Если вам нужно использовать эти адаптеры, использование идентично стандартным адаптерам указателей функций. Например,

bool bad(std::string foo) { ... }
...
std::vector<std::string> c;
...
std::vector<std::string>::iterator it
     = std::find_if(c.begin(), c.end(), std::not1(boost::ptr_fun(bad)));

Обратите внимание, однако, что эта библиотека содержит расширенныеотрицатели, которые поддерживают функции объектов, поэтому строка выше может быть написана одинаково.

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

Шаблон черт вызова, используемый для реализации этого улучшения, опирается на частичную специализацию, поэтому это улучшение доступно только на компиляторах, которые поддерживают эту функцию. С другими компиляторами аргумент, переданный функции, всегда будет передаваться посредством ссылки, создавая таким образом возможность ссылок на ссылки.


Valid HTML 4.01 Transitional

Пересмотрено02 Декабря 200602 December, 2006[ORIG_END] -->

Авторское право и копия; 2000 Cadenza New Zealand Ltd.

Распространяется под лицензией Boost Software License, версия 1.0. (См. сопроводительный файлLICENSE_1_0.txtили копию по адресу) http://www.boost.org/LICENSE_1_0.txt

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




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:55:09/0.0064780712127686/0