我是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()
但如果你至少使用标准库,你将使你的生活更轻松.基本上我会使用std :: bind将你的对象和你的成员函数绑定到函数void()(void),然后将这些对象存储在std :: vector中.
编辑:Oktalist更快;)