C++回调系统。指向成员函数的指针

标签 c++ function pointers callback member

我试图通过将指针传递给成员函数来创建回调,但遇到了所有类型的问题。

我怎样才能实现这样的事情

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/

相关文章:

c++ - 缺少方法: SXS and Controls.的奇怪案例在 "object doesn'中添加结果支持此属性或方法”?

java - 更新不同类中的变量

C++如何创建一个接受字符串并返回函数的映射

c - 在 C 中传递字符串最安全的方法是什么?

c - 出队功能无法正常工作

c++ - 每次我在 visual studio 2015 中构建时出现权限错误

c++ - Allegro 5 al_create_display(x, y) 不工作

c++ - 获取 opencv 2.4.3 的编译错误

function - 调用存储在字符串变量中的函数名称?

c++ - 从存储在 vector 中的指针获取对象属性