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.
本文详细阐述了如何利用C++的std::function和std::bind实现函数执行体与函数上下文之间的动态绑定,展示了闭包的概念及其在实际编程中的应用。通过实例代码演示了如何在不显式传递A类对象的情况下调用B类的成员函数,并成功访问并使用A类的成员变量。
762

被折叠的 条评论
为什么被折叠?



