Карта сайта 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

Binders

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

  • связующее1-е
  • связующее2nd

А также соответствующие функции помощника

  • связь1st
  • связь2nd

Ключевое преимущество этих адаптеров перед теми, которые находятся в Стандартной библиотеке, заключается в том, что они избегают проблемы ссылок на ссылки.

Usage

Использование идентично стандартным связующим. Например,

class Foo {
public:
  void bar(std::ostream &);
  // ...
};
// ...
std::vector<Foo> c;
// ...
std::for_each(c.begin(), c.end(), 
              boost::bind2nd(boost::mem_fun_ref(&Foo::bar), std::cout));

References to References

Рассмотрим пример использования выше

class Foo {
public:
  void bar(std::ostream &);
  // ...
};
// ...
std::for_each(c.begin(), c.end(), 
              boost::bind2nd(boost::mem_fun_ref(&Foo::bar), std::cout));

Если бы это было написано с использованием std::bind2nd и std::mem_fun_ref, вряд ли это было бы компиляцией.

Проблема возникает потому, что bar принимает опорный аргумент. Стандарт определяет std::mem_fun_ref таким образом, что он создает объект функции, чей second_argument_type будет std::ostream&.

Призыв к bind2nd создает binder2nd, который Стандарт определяет следующим образом:

template <class Operation>
class binder2nd
    : public unary_function<typename Operation::first_argument_type,
                            typename Operation::result_type> {
...
public:
  binder2nd(const Operation& x,
            const typename Operation::second_argument_type& y);
  ...

Поскольку тип second_argument_type std::ostream&, тип y в конструкторе будет std::ostream&&. Поскольку вы не можете иметь ссылку на ссылку, на этом этапе мы должны получить ошибку компиляции, потому что ссылки на ссылки являются незаконными в C++ (но см. C++). Стандартный список активных языковых вопросов .

Вяжущие в этой библиотеке избегают этой проблемы, используя шаблоны Boost call_traits.

Наш конструктор объявлен

binder2nd(const Operation& x,
          typename call_traits<
             typename binary_traits<Operation>::second_argument_type
          >::param_type y)

В результате y имеет тип std::ostream&, и наш пример компилируется.


Valid HTML 4.01 Transitional

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

Copyright © 2000 Cadenza New Zealand Ltd.

Распространяется в соответствии с Лицензией на программное обеспечение Boost версии 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-07-05 01:58:20/0.0034229755401611/0