本文共 1651 字,大约阅读时间需要 5 分钟。
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//std::cout#include // std::binddouble 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 (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;}
参考:
转载地址:http://ckiub.baihongyu.com/