静态函数或者全局函数回调
在C++的类中,对于静态成员函数的回调很简单,直接输入静态函数的函数地址即可,当需要调用的时候,直接通过类名与函数名即可完成调用。
类的非静态成员函数回调
对于类的非静态成员函数,由于需要指定当前函数被哪个对象调用(this),所以对于类的非静态成员函数的回调,我们需要保持当前的this指针和需要回调的函数地址。
1. 首先,由于需要保持任意的类,而且各个类之间没有任何关联,所以使用模板类来进行该类的对象保持。
T* mObj;
2. 对于回调的函数,需要保持函数的地址,比如我这需要回调的函数入参为空,返回值为bool,所以:
typedef bool (T::*EventCallBack)();
EventCallBack mEventBack;
3. 当最后需要调用时,直接通过 mObj去调用函数地址即可:
(mObj->*mEventBack)();
上述则是对非静态成员函数的回调,对于GUI系统中用的比较多,同时也可以直接使用第三方库sigc++等实现。
以下则是我基于我的GUI系统实现的函数回调:
1. 类中注册回调事件处理函数:
mCursor->registerEvent(MOUSE_MOVE, &MainView::onButtonDownBk, this);
2. 保存注册回调函数:
/*
*event call back
*/
template<class T>
void registerEvent(EventState state, bool (T::*eventBack)(), T* obj)
{
if (mEventSlot.find(state) == mEventSlot.end())
{
mEventSlot[state] = new EventSlot<T>(eventBack, obj);
}
}
std::map<EventState, EventSlotBase*> mEventSlot;
3. 回调函数的实现:
class EventSlotBase
{
public:
virtual ~EventSlotBase() {};
virtual bool operator()() = 0;
};
template<class T>
class EventSlot : public EventSlotBase
{
public:
typedef bool (T::*EventCallBack)();
EventSlot(EventCallBack eventBack, T* obj)
{
mEventBack = eventBack;
mObj = obj;
}
virtual bool operator()()
{
return (mObj->*mEventBack)();
}
private:
EventCallBack mEventBack;
T* mObj;
};
4. 注册函数的调用:
if (mEventSlot.find(state) != mEventSlot.end())
{
(*mEventSlot[state])();
}