是用来绑定函数调用的某些参数,可以将bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成新的可调用对象来适应原对象的参数列表。
调用bind的一般形式:auto newCallable = bind(callable,arg_list);
其中,newCallable本身是一个可调用对象,arg_list是一个逗号分隔的参数列表,对应给定的callable的参数。即,当我们调用newCallable时,newCallable会调用callable,并传给它arg_list中的参数。
arg_list中的参数可能包含形如_n的名字,其中n是一个整数,这些参数是“占位符”,表示newCallable的参数,它们占据了传递给newCallable的参数的“位置”。数值n表示生成的可调用对象中参数的位置:_1为newCallable的第一个参数,_2为第二个参数,以此类推。
1、绑定普通函数
#include <functional>
int sumRun(const int &a, const int &b, const int &c)
{
cout << "计算公式的值= " << a << "x" << b << "-" << c << endl;
return a * b - c;
}
int main()
{
int a = 3;
int b = 2;
int c = 1;
auto sum1 = bind(sumRun,placeholders::_1, placeholders::_2, placeholders::_3);
function<int(int, int, int)> fun1 = bind(sumRun, placeholders::_1,
placeholders::_2, placeholders::_3);
cout << "sumRun: " << sumRun(a,b, c) << endl;
cout << "sum1: " << sum1(a, b, c) << endl; cout <<"fun1: " << fun1(a, b, c) << endl;
return 0;
}
输出结果: D:\code\C++\CLion\myConfig\cmake-build-debug\myConfig.exe
sumRun: 计算公式的值= 3x2-1
5
sum1: 计算公式的值= 3x2-1
5
fun1: 计算公式的值= 3x2-1
5
2、绑定类的成员函数
bind绑定类成员函数时,第一个参数表示对象成员函数的指针,第二个参数表示对象的地址。
必须显示的指定&Plus::plus,因为编译器不会将对象的成员函数隐式转换成函数指针,所以必须在Plus::plus前面添加&。
使用对象成员函数的指针时,必须知道该指针属于哪个对象,因此第二个参数为对象的地址&plus。
#include<iostream>
#include<functional>
using namespace std;
class Plus
{
public:
int plus(int a,int b)
{
return a+b;
}
}
int main()
{
Plus p;
指针形式调用成员函数
function<int(int,int)> func1 = std::bind(&Plus::plus,&p, placeholders::_1, placeholders::_2);
对象形式调用成员函数
function<int(int,int)> func2 = std::bind(&Plus::plus,p, placeholders::_1, placeholders::_2);
cout<<func1(1,2)<<endl; //3
cout<<func2(1,2)<<endl; //3
retunrn 0;
}
3、绑定类静态成员函数
#include<iostream>
#include<functional>
using namespace std;
class Plus
{
public:
static int plus(int a,int b)
{
return a+b;
}
}
int main()
{
function<int<int,int>> func1 = std::bind(&Plus::plus, placeholders::_1, placeholders::_2);
cout<<func1(1,2)<<endl; //3
retunrn 0;
}