boost::bind 的原理是 函数对象
函数对象:重载了( )操作符的对象
function_name() // 调用function_name这个对象 的 ()方法,而非调用一个叫function_name的函数方法。
template<class R,class F> bind(F f);
template<class R,class F,class A1> bind(F f , A1 a1);
namespace
{
boost::arg<1> _1;
boost::arg<2> _2;
boost::arg<3> _3;
….. //其他6个占位符
};
boost::bind接收的第一个参数必须是一个可调用的对象f,包括函数、函数指针、函数对象、和成员函数指针,之后bind最多接受9个参数,参数数量必须与f的参数数量相等
这些参数被传递给f作为入参。 绑定完成后,bind会返回一个函数对象,它内部保存了f的拷贝,具有operator(),返回值类型被自动推导为f的返回类型。在发生调用时这个函数对象将把之前存储的参数转发给f完成调用
boost::bind(函数名, 参数1,参数2,...)
boost::bind(&类名::方法名,类实例指针,参数1,参数2)
void function_name(int a, int b, int c)
boost::bind(function_name, 1, _1, _2)得到一个函数对象bind_ret_func_obj,当我们调用bind_ret_func_obj(9,46)时,相当于调用function_name(1,3,46)
boost::bind(function_name, _2, 3, _1)得到一个函数对象bind_ret_func_obj,当我们调用bind_ret_func_obj(8,7)时,相当于调用function_name(7,3,8)
_x这样的就是占位符,_1表示实际调用时的第一个参数的位置,也即bind_ret_func_obj(8,7)时_1代表第一个参数8,_2代表第二个参数7
类名::方法名的例子similarly