关于std::bind
的一些内容。大体上是翻译自http://www.cplusplus.com/reference/functional/bind/
std::bind
位于头文件<functional>
中,可以用于绑定函数的参数,从而将一个可调用对象转化为一个新的可调用对象,可以起到函数适配器的作用。bind
函数的原型如下:
1 | template <class Fn, class... Args> /* unspecified */ bind (Fn&& fn, Args&&... args); |
bind
会返回一个基于fn
的函数对象,并将其参数绑定到args
。每个参数都可以绑定到一个值或者占位符(placeholder)。如果绑定到值,则调用返回的函数对象时,总是会使用该绑定的值作为参数。如果绑定到占位符,调用返回的函数对象时,将会将传入的参数按照定义的占位符指定的顺序转发给原函数。
调用返回的函数对象,会得到与fn
相同的返回值,除非显式地指定了返回类型Ret
,注意Ret
只是一个模板参数,不能够通过函数的参数隐式推导。
返回的函数对象有以下的特性:
- 调用的返回值与
fn
使用绑定的参数(或使用占位符时参数转发)时返回值相同。 - 对于第一种情况,返回的函数对象可能会有一个
result_type
成员,如果Fn是一个指向函数的指针,或成员函数,则result_type
被定义为其返回类型的代名,否则如果存在Fn::result_type
的话会被定义为Fn::result_type
。 - 对于第二种情况,其会有一个成员
result_type
,定义是Ret
的代名。 - 可以移动构造(move-constructible),并且如果它的所有参数都可以拷贝构造(copy-constructible),它也可以拷贝构造。如果
Fn
和Args...
的退化类型(decay type)的构造函数都不会抛出异常,则其两种构造函数也都不会抛出异常。
参数说明:
fn
:一个函数对象、指向函数的指针或指向成员的指针。Fn
的退化类型应当是可以使用fn
来移动构造的。args…
:要绑定的参数列表,可以是值或者占位符。Args...
的退化类型应当可以分别从args...
对应参数移动构造而来,如果其中任意参数的退化类型是reference_wrapper
,则会绑定它的引用。
返回值:
一个函数对象,当调用它时,则会使用绑定的参数调用fn
。如果fn
是一个成员的指针,则返回的函数对象需要的第一个参数应当是该类的对象(或它的引用或指针)。
以下是一个较完整的示例:
1 | // bind example |