simple(1)
template <class Fn, class... Args> /*
unspecified */ bind (Fn&& fn, Args&&... args);
simple(2)(带返回类型)
template <class Ret, class Fn, class... Args> /*
unspecified */ bind (Fn&& fn, Args&&... args);
定义:
返回一个基于Fn的function对象,Fn的所有参数绑定到args
Fn需要的参数可以绑定到一个值或者占位符(std::placeholders)
- 如果绑定到一个值,调用返回的方法对象时,将要使用绑定的值作为参数
- 如果绑定到一个占位符,调用返回的函数对象时使用的参数,将会传递给被调用的函数作为参数(参数的对应索引由占位符的决定)。
调用返回的对象将返回与fn相同的类型,除非将特定的返回类型指定为Ret(2)(注意,Ret是惟一不能通过传递给这个函数的参数隐式推导的模板参数)。
返回的对象有下面的属性:
- 返回的函数对象的参数绑定到args…(或作为占位符转发)。
- 对于simple(1),它可能有一个成员result_type:如果Fn是一个指向函数或成员函数类型的指针,它被定义为其返回类型的别名。否则,如果存在这样的成员类型,则将其定义为Fn::result_type。
- 对于simple(2),它有一个成员result_type,决定调用函数对象时的返回值类型。
- 它是可移动可构造的,如果它的所有参数的类型都是可复制可构造的,那么它也是可复制可构造的。如果Fn和Args的衰变类型没有相应的构造函数,那么这两个构造函数都不会抛出。
参数:
fn:一个指向函数或者成员的指针。
args...:将要绑定的参数列表,类型为值或者占位符。
返回类型:
返回一个函数对象,调用的时候,将会使用绑定的参数调用fn。
如果fn是一个指向类成员的指针,返回的函数对象被调用时,第一个参数必须是函数fn定义所在的类实例对象。
示例:
// bind example
#include <iostream> // std::cout
#include <functional> // std::bind
// a function: (also works with function object: std::divides<double> my_divide;)
double my_divide (double x, double y) {return x/y;}
struct MyPair {
double a,b;
double multiply() {return a*b;}
};
int main () {
using namespace std::placeholders; // adds visibility of _1, _2, _3,...
// binding functions:
auto fn_five = std::bind (my_divide,10,2); // returns 10/2
std::cout << fn_five() << '\n'; // 5
auto fn_half = std::bind (my_divide,_1,2); // returns x/2
std::cout << fn_half(10) << '\n'; // 5
auto fn_invert = std::bind (my_divide,_2,_1); // returns y/x
std::cout << fn_invert(10,2) << '\n'; // 0.2
auto fn_rounding = std::bind<int> (my_divide,_1,_2); // returns int(x/y)
std::cout << fn_rounding(10,3) << '\n'; // 3
MyPair ten_two {10,2};
// binding members:
auto bound_member_fn = std::bind (&MyPair::multiply,_1); // returns x.multiply()
std::cout << bound_member_fn(ten_two) << '\n'; // 20
auto bound_member_data = std::bind (&MyPair::a,ten_two); // returns ten_two.a
std::cout << bound_member_data() << '\n'; // 10
return 0;
}
结果:
|
Data Races:
参数能在被调用时获取或修改
Exception safety:
如果一个异常被抛出,所有涉及到的对象都被设为有效的状态。
这个函数只有在其内部元素(Fn和Args的衰变类型…)的构造抛出时才会抛出。