Bind
头文件: "boost/bind.hpp"
Bind 库创建函数对象来绑定到一个函数(普通函数或成员函数)。不需要直接给出函数的所有参数,参数可以稍后给,这意味着绑定器可以用于创建一个改变了它所绑定到的函数的 arity (参数数量) 的函数对象,或者按照你喜欢的顺序重排参数。
函数 bind
的重载版本的返回类型是未指定的,即不能保证返回的函数对象的特征是怎样的。有时,你需要将对象存于某处,而不是直接把它传送给另一个函数,这时,你要使用 Boost.Function, 它在 "Library 11: Function 11." 中讨论。弄明白 bind
函数返回的是什么的关键在于,理解它发生了什么转换。用 bind
函数的一个重载,template<class R, class F> unspecified-1 bind(F f)
来作为例子,返回类型就是 (引用自在线文档),"一个函数对象 l ,表达式 l(v1, v2, ..., vm) 等同于 f(),隐式转换为 R"。这样,这个被绑定的函数就被保存在绑定器里面,以后对这个函数对象的调用就会得到被绑定的函数的返回值(如果有),即模板参数 R
. 我们在这讨论的实现支持最多九个函数参数。
Bind 的实现包括许多函数和类,但作为用户来说,我们不直接使用除了重载函数 bind
以外的任何东西。所有绑定通过 bind
函数发生,我们可以无须依赖于返回值的类型。使用 bind
时,参数占位符(命名为 _1
, _2
, 等等)不需要用一个using声明或using指示来引入,因为它们位于匿名名字空间。这样,在使用 Boost.Bind时,没有理由写出以下的代码。
using boost::bind;
using namespace boost;
前面曾经提到过,当前的 Boost.Bind 实现支持九个占位符(_1
, _2
, _3
, 等等),也就是说最多九个参数。粗略地过一下大纲对于深入理解如何进行类型推断是有好处的,还可以知道何时/为何它不总是可以工作的。花点时间分析一下成 员函数指针与普通函数的署名特征也是很有用的。你将会看到对于普通函数和类成员函数,各有各的重载版本。还有,对于每一个数量的参数,也都有不同的重载。 我不在这里列出所有大纲了,建议你到www.boost.org参考一下 Boost.Bind 的文档。