bind是什么
bind是一个标准库函数,定义在functional头文件中。可以将bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成新的可调用对象来适应原对象的参数列表。
bind-绑定一切函数
std::bind可以绑定一切函数
• 将函数、成员函数和闭包转成function函数对象
• 将多元(n>1)函数转成一元函数或者(n-1)元函数。
1.改变参数个数,绑定全局函数:
int f(int, char, double);
auto ff = bind(f, _1, 'c', 1.2); // 绑定f()函数调用的第二个和第三个参数,返回一个新的函数对象为ff,它只带有一个int类型的参数
int x = ff(7); // f(7, 'c', 1.2);
2.改变参数的顺序
int f(int, char, double);
auto frev = bind(f, _3, _2, _1); // 翻转参数顺序
int x = frev(1.2, 'c', 7); // f(7, 'c', 1.2);
有以下类:
class student{
private:
string name;
int age;
public:
static void showpersonms(string name,int age)
{
cout << "my name is " << name << ",and I am " << age << " years old!\n";
}
void introduce(string name,string addr)
{
cout << "my name is " << name<< " and my addr is " << addr << endl;
}
};
3.绑定静态成员函数
auto pfx = bind(student::showpersonms, std::placeholders::_1, std::placeholders::_2);
pfx("jack",27);
结果:
4.绑定普通成员函数
student s;
auto myfun = std::bind(&student::introduce, s, std::placeholders::_1, std::placeholders::_2);
结果:
设置类成员函数为回调函数
回调函数往往通过函数指针来实现,而类的成员函数,多了一个隐含的参数this,所以直接赋值给函数指针会引起编译报错。通过bind可以解决此问题
class MyClass
{
public:
MyClass() :n(0) {};
~MyClass()=default;
void add(int i) { n += i; cout << n; }
private:
int n;
};
MyClass a;
auto f = bind(&MyClass::add, &a, _1);
f(1);//输出1
f(2);//输出 3