Boost C++ 库

……全球最受推崇、设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu,《C++ Coding Standards

Boost 函数对象适配器库 - Boost C++ 函数库

改进的函数对象适配器

头文件 functional.hpp 增强了 C++ 标准库中指定的函数对象适配器(20.3.5 至 20.3.8 节)。这些增强主要得益于两项更改。

  1. 我们使用 Boostcall_traits模板来避免“引用指向引用”的问题,并提高参数传递的效率。
  2. 我们使用两个 函数对象特性 类模板,以避免在此库的适配器中需要使用ptr_fun

目录

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

函数对象特性 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 编译器缺乏偏特化,因此此库提供的功能比标准适配器提供的功能多不了多少。
  • 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 复制)