C多个回调成员函数来自不同的类,没有std和boost

我是C的新手,我不想使用任何库,因为我想真正理解内部发生的事情.
另外,我尽量保持我的库使用尽可能低(以提高性能),使其尽可能与平台无关(不导出库).
总而言之,我不想使用std或boost来解决这个问题.

我的问题:

我有一个EventHandler,它有一个功能:

template<class T> void EventHandler::SetCallbackFunction(T* obj, void (T::*mem_fkt)(void));

我必须保存对象和函数以便稍后调用它.
有两种可能性:

> EventHandler作为模板类(和typedef)
> void * – >但要调用函数我需要将其强制转换为此我需要classname:/

为什么这些不起作用:
– EventHandler不能是模板类,因为它需要处理多个类.
– void * – >我不知道如何保存类名以便稍后再使用它

我怎样才能做到这一点?
(或者还有另一种方法吗?也许是一种保存类名以便稍后再使用它的方法?)

编辑:
此外,我可能需要为每个类注册多个回调函数,因此接口实际上不是一个选项.

class A {
 public:
   void CallbackFktForEventHandler();
   void CallbackFktForAnimationHandler();
   etc...
};

而且我知道你可以基于这样的事情来解决它:

class A{
  public:
    void Callback();
    static void CallbackStatic(void* self){
      static_cast<A*>->CallBack();
    };
};

但这限制了我的口味.

解决方法:

你可以试试这个:

创建一个只有一个函数call()的(纯虚拟)基类:

class Function{
  virtual void call()=0;
}

创建一个模板化的类,它存储一个函数指针和一个对象,并使它继承自Function

template<typename T>
class TemplatedFunction{
  void (T::*m_fkt)(void);
  T* m_obj;

  TemplatedFunction(T* obj, void (T::*fkt)(void)):m_fkt(fkt),m_obj(obj){}

  void call{
    (m_obj->*m_fkt)();
  }
}

然后在Event-Handler中存储指向Function的指针,只需使用Function-> call()

在线试用:http://ideone.com/3Hu5pw

但如果你至少使用标准库,你将使你的生活更轻松.基本上我会使用std :: bind将你的对象和你的成员函数绑定到函数void()(void),然后将这些对象存储在std :: vector中.

编辑:Oktalist更快;)

上一篇:js轮播图


下一篇:java