头文件 functional.hpp 增强了 C++ 标准库中指定的函数对象适配器(20.3.5 至 20.3.8 节)。这些增强主要得益于两项更改。
该头文件包含以下函数和类模板:
函数对象特性 | unary_traits binary_traits |
用于确定函数对象和函数的参数类型。消除了对ptr_fun. |
---|---|---|
Negators | unary_negate binary_negate not1 not2 |
的需求。基于标准第 20.3.5 节。 |
绑定器 (Binders) | 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 复制)