头文件 functional.hpp 对 C++ 标准库(第 20.3.5 节到 20.3.8 节)中指定的函数对象适配器进行了增强。这些增强主要由于两个变化而成为可能
该头文件包含以下函数和类模板
函数对象特征 | unary_traits binary_traits |
用于确定函数对象和函数的参数类型。消除了对ptr_fun. |
---|---|---|
否定器 | unary_negate binary_negate not1 not2 |
基于标准的 20.3.5 节。 |
绑定器 | binder1st binder2nd bind1st bind2nd |
基于标准的 20.3.6 节。 |
函数指针适配器 | pointer_to_unary_function pointer_to_binary_function ptr_fun |
基于标准的 20.3.7 节。此库不需要使用它,因为绑定器和否定器可以适配函数,但第三方适配器可能需要它。 |
成员函数指针适配器 | mem_fun_t mem_fun1_t const_mem_fun_t const_mem_fun1_t mem_fun_ref_t mem_fun1_ref_t const_mem_fun_ref_t const_mem_fun1_ref_t mem_fun mem_fun_ref |
基于标准的 20.3.8 节。 |
使用这些适配器应该与使用标准函数对象适配器几乎相同;唯一的区别是你需要写boost:而不是std:,而且你会减少麻烦。
例如,假设你有一个Person类,其中包含一个set_name函数
class Person { public: void set_name(const std::string &name); // ... };
你可以重命名集合中的一群人,c,通过编写
std::for_each(c.begin(), c.end(), boost::bind2nd(boost::mem_fun_ref(&Person::set_name), "Fred"));
如果使用标准适配器,则此代码通常无法编译,因为set_name采用引用参数。请参阅绑定器文档中的注释以解释为什么会这样。
头文件和测试程序已使用以下编译器进行编译
编译器 | 注释 |
---|---|
Borland C++Builder 4 Update 2 | 没有已知问题。 |
Borland C++ 5.5 | 没有已知问题。 |
g++ 2.95.2 | 没有已知问题。 |
Microsoft Visual C++ Service Pack 3 | 编译器缺少部分特化,因此该库提供的功能比标准适配器提供的功能略多
|
该库的主要重点是解决引用引用的问题,同时尽可能地与标准库保持兼容。这允许你使用你在书籍和杂志中读到的技术与当今的许多编译器一起使用。
从长远来看,可能会出现更好的解决方案
感谢 John Maddock 建议了允许函数对象特征正常工作的机制。Jens Maurer 在正式审查过程中提供了宝贵的反馈。
修订日期2006 年 12 月 2 日
版权所有 © 2000 Cadenza New Zealand Ltd.
根据 Boost 软件许可证,版本 1.0 进行分发。(请参阅随附文件 LICENSE_1_0.txt 或复制于 https://boost.ac.cn/LICENSE_1_0.txt)