bind函数可以看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适用”原对象的参数列表
调用bind的一般形式:auto newCallObject = bind(callObject, arg_list);
其中,newCallObject本是是一个可调用对象,arg_list是一个逗号分隔的参数列表,对应给定的callObject的参数,
即当我们调用newCallObject时,newCallObject会调用callObject,并将arg_list中的参数传给callObject。
如果arg_list里的参数包含_n的名字,其中n是一个整数,表过“占位符”,在调用newCallObject时需要将填写相应的参数,
_1为newCallObject的第一个参数,_2为newCallObject的第二个参数,以此类推。
下面来看来示例:
#include <iostream> //std::cout
#include <functional> // std::bind
double my_divide(double x, double y) {return x / y;}
class MyPair {
public:
double a, b;
double multiply() {return a * b;}
};
int main()
{
using namespace std::placeholders;//占位符空间 adds visibility of _1, _2, _3
//绑定普通函数
auto fn_five = std::bind(my_divide, 10, 2);
std::cout << "fn_five()===" << fn_five() << std::endl;
//绑定普通函数,需要传递一个参数,参数列表从左至右_1====>x
auto fn_half = std::bind(my_divide, _1, 2);
std::cout << "fn_half()===" << fn_half(10) << std::endl;
//绑定普通函数,需要传递两个参数,参数列表从左至右_1====>x, _2===>y
auto fn_invert = std::bind(my_divide, _2, _1);
std::cout << "fn_invert()===" << fn_invert(10, 2) << std::endl;
//绑定普通函数,需要传递两个参数,参数列表从左至右_1====>x, _2===>y 与填写顺序无关
auto fn_rounding = std::bind<int>(my_divide, _1, _2);
std::cout << "fn_rounding()===" << fn_rounding(10, 3) << std::endl;
MyPair ten_two {10, 2};
//绑定成员函数
auto bound_member_fn = std::bind(&MyPair::multiply, _1);//一个参数
std::cout << "bound_member_fn()===" << bound_member_fn(ten_two) << std::endl;
//绑定数据成员
auto bound_member_data = std::bind(&MyPair::a, ten_two);
std::cout << "bound_member_data()===" << bound_member_data() << std::endl;
return 0;
}
参考: