Boost C++ 库

...世界上最受尊敬和专家设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

改进的函数对象适配器

头文件 functional.hpp 对 C++ 标准库(第 20.3.5 节到 20.3.8 节)中指定的函数对象适配器进行了增强。这些增强主要由于两个变化而成为可能

  1. 我们使用 Boostcall_traits模板来避免引用引用的问题,并提高参数传递的效率。
  2. 我们使用两个函数对象特征类模板来避免ptr_fun与该库中的适配器一起使用的需要。

内容

该头文件包含以下函数和类模板

函数对象特征 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 编译器缺少部分特化,因此该库提供的功能比标准适配器提供的功能略多
  • call_traits机制无法防止引用引用,因此该库中的适配器将可用于更少的情况。
  • function_traits机制无法确定函数的参数和结果类型,因此ptr_fun仍然需要适配函数.

未来方向

该库的主要重点是解决引用引用的问题,同时尽可能地与标准库保持兼容。这允许你使用你在书籍和杂志中读到的技术与当今的许多编译器一起使用。

从长远来看,可能会出现更好的解决方案

  1. 几位 Boost 成员正在开发表达式模板库。这些将允许更自然的语法来组合和调整函数。由于这是一项新技术,它可能需要一段时间才能成熟并得到主要编译器的广泛支持,但它显示出巨大的潜力。与此同时,functional.hpp 库填补了这一空白。
  2. 标准委员会已经认识到在模板实例化期间出现引用引用的问题,并已采取措施修复标准(请参阅C++ 标准核心语言活动问题列表)。

作者

Mark Rodgers

致谢

感谢 John Maddock 建议了允许函数对象特征正常工作的机制。Jens Maurer正式审查过程中提供了宝贵的反馈。


Valid HTML 4.01 Transitional

修订日期2006 年 12 月 2 日

版权所有 © 2000 Cadenza New Zealand Ltd.

根据 Boost 软件许可证,版本 1.0 进行分发。(请参阅随附文件 LICENSE_1_0.txt 或复制于 https://boost.ac.cn/LICENSE_1_0.txt