bind
#include <iostream>
#include <functional>
using namespace std;
class A {
public:
void fun() {
cout << i_ << endl;
}
void set_i(int i){
i_ = i;
}
int i_ = 1;
};
int main() {
A a;
auto f1 = bind(&A::fun, &a);//传指针
auto f2 = bind(&A::fun, a);//传对象
a.set_i(5);
f1();
f2();
return 0;
}
输出:
传入对象版本,直接是一个临时对象,不反应原对象的更改
要点:
- bind传入成员函数一定要使用&A::fun而不是A::fun,若使用A::fun会被编译器报错。&本身的含义是对后面的A::fun取地址,其是就是A::fun表示的意思,只不过编译器语法不支持
- bind传入成员函数的第一个参数可以是对象指针,可以是对象。前者可以直接修改对象,后者仅仅影响对象的副本
- bind返回的不是function对象,而是一个_Binder对象,如下图所示:
function
function可以用来接住bind返回的_Binder对象
用法:
#include <iostream>
#include <functional>
using namespace std;
class A {
public:
void fun() {
cout << i_ << endl;
}
void set_i(int i){
i_ = i;
}
int i_ = 1;
};
function<void(void)> f1;
function<void(void)> f2;
int main() {
A a;
f1 = bind(&A::fun, &a);
f2 = bind(&A::fun, a);
a.set_i(5);
f1();
f2();
return 0;
}
再查看一下function的类型: