std::bind的基本用法是,绑定一个函数对象,和一堆参数,生成一个新的可调用函数,调用该函数时,会调用绑定的函数对象,且把参数传递进去:
auto function = std::bind(fun, arg_list);
参数列表也可以不指定,先使用占位符来占位,等到真正使用的时候再根据参数传递进去。下面是几个简单的例子:
void bind_test(int num1, int num2, int num3) {
std::cout << "num1 = " << num1 << ", num2 = " << num2 << ", num3 = " << num3 << std::endl;
}
int main()
{
auto bind_fun1 = std::bind(bind_test, 1, 2, 4);
bind_fun1();
auto bind_fun2 = std::bind(bind_test, 1, std::placeholders::_1, std::placeholders::_2);
bind_fun2(2, 3);
auto bind_fun3 = std::bind(bind_test, 1, std::placeholders::_1, std::placeholders::_2);
bind_fun3(8, 9, 6);
}
num1 = 1, num2 = 2, num3 = 4
num1 = 1, num2 = 2, num3 = 3
num1 = 1, num2 = 8, num3 = 9
注意看bind_fun3(8,9,6) 虽然我们传进来三个参数,但是在std::bind的时候已经有一个默认值,所以num1是1,不受后面bind_fun3参数的影响,且占位符是从_1开始的。表示新的可调用对象的第 几个参数和原函数的第几个参数进行匹配;即bind_fun3的第一个参数和原函数的第二个匹配,第2个参数和原函数的第三个匹配
bind的内部实现原理可以参考文章:https://www.cnblogs.com/xusd-null/p/3698969.html