std::function std::bind
下面是通过这两个实现 函数执行体跟函数上下文的动态绑定 (C++闭包)
#include <iostream>
#include <functional>
using namespace std;
typedef std::function<void(char*)> ccMenuCallback;
class B{
public:
virtual ~B(){}
B(){cout<< "B::B()" << endl;}
B(const ccMenuCallback& _callback){
cout<< "B::Bcallback()" << endl;
this->_callback = _callback;
cout<< "B::Be()" << endl;
}
void bf() {
cout<< "B::bf()" << endl;
_callback(this->name);
}
ccMenuCallback _callback;
char *name = "Bname";
};
class A {
public:
virtual ~A(){}
A(){}
void f(char* name) {
cout << "A::f()" << this->inta<< name<< endl;
}
void init() {
//注意
ccMenuCallback f = std::bind(&A::f,this,std::placeholders::_1);
// f();
pb = new B(f);
}
B *pb;
int inta = 5;
};
int main() {
A* pa = new A;
pa->init();
// pa->pb->_callback();
pa->pb->bf();
return 0;
}
理解上面注意下面2点:
1. B::bf(), 不需要显式的A类对象,而是直接函数式调用,
2. 可以访问绑定到其上的A成员变量inta , 同时他还可以传入额外的数据B类的name.