C++中的std::bind用法总结

std::bind包含在标准库头文件#include<functional>中,它是一种函数适配器,接收一个可调用对象,生成一个新的可调用对象来适配原对象的参数列表。

使用格式

std::bind使用的一般形式:

1
auto new_fun = bind(fun, arg_list);

其中fun是一个函数,arg_list是用逗号隔开的参数列表。调用new_fun()相当于调用fun(arg_list)

常见用法

用法一:改变参数的个数

头文件:

1
2
3
4
#include <iostream>  
#include <functional>
using namespace std;
using namespace std::placeholders;

现在定义一个函数,接收一个数组array,数组长度n和某个数num,它将实现打印数组中大于num的功能

1
2
3
4
5
6
7
8
auto fun = [](int *array, int n, int num){  
for (int i = 0; i < n; i++)
{
if (array[i] > num)
cout << array[i] << ends;
}
cout << endl;
};

利用std::bind函数将原来函数调用所需要的参数固定为2个,实现过程如下:

1
2
3
int array[] = { 1, 3, 5, 7, 9 };  
auto new_fun = bind(fun, _1, _2, 5); //_1,_2是占位符,固定num=5
new_fun(array, sizeof(array) / sizeof(*array)); // 调用只需要2个参数了

上面代码中_1,_2是占位符,定义于命名空间placeholders中,_1是nnew_fun的第一个参数,_2是new_fun的第二个参数,以此类推。在本例中,fun()的调用需要传递三个参数,而用bind()进行绑定后只需两个参数了,因为第三个参数在绑定时被固定了下来。减少函数参数的调用,这是bind最常见的用法。

用法二:更改参数的顺序

bind的另一个常见的用法是更改参数的调用顺序,如

1
2
int fun(int a, int b);
auto new_fun = bind(fun, _2, _1);

此时,调用new_fun(1, 2)相当于调用fun(2, 1)