我试图通过将指针传递给成员函数来创建回调,但遇到了所有类型的问题。
我怎样才能实现这样的事情
template<class T> class A{
void (T::*callBackFunction)(int);
public:
void addCallBack(void (T::*callBackFunction)(int)){
void (T::*callBackFunction)(int) = &callBackFunction;
}
void performCallBack(){ //I want this to activate the specified function in class B
callBackFunction(3);
}
};
Class B{
A<B> a1;
A<B> a2;
B(){
a1.addCallBack(&a1CallBack);
a2.addCallBack(&a2CallBack);
}
void a1CallBack(int i){
// do stuff
}
void a2CallBack(int i){
// do stuff
}
};
最佳答案
你可以这样做。虚基类BaseCB允许B完全不知道C的类型但仍然调用回调。
class BaseCB{
public:
virtual void operator()(int x)=0;
};
template<class ClassT>
class CCallback : public BaseCB {
public:
typedef void(ClassT::* FuncT)(int);
FuncT _fn;
ClassT* _c;
CCallback(ClassT* c, FuncT fn):_fn(fn),_c(c){}
void operator()(int x){
return (_c->*_fn)(x);
}
};
class B {
public:
BaseCB* a;
void invokecb(int n){
(*a)(n);
}
};
class C {
B b;
public:
C(){
b.a = new CCallback<C>(this,&C::cb);
b.invokecb(3);
};
void cb(int n)
{
cout << n;
}
};
C c; // create an instance of c and test the cb mechanism
关于C++回调系统。指向成员函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3995631/