我試圖做一個簡單的事件調度系統。簡而言之,我擁有所有派生IEvent接口的事件類。我也有幾個方法的一個eventmanager進行類:C++回調系統
void addListener(int eventID, std::function<void(IEvent *event)> callback);
void dispatchEvent(int eventID, IEvent *event);
的eventmanager進行具有圖矢量的:
std::map<int, std::vector<std::function<void(IEvent *)> > > m_events;
然後,任何物體可以通過的addListener方法寄存器,給它一個回調和它會被通知當有人調用dispatchEvent具有相同事件類型:
// add an event listener
EventManager::addListener(Event_MouseMove, std::bind(&Obj::callback, this, std::placeholders::_1));
// the callback method
void Obj::callback(IEvent *e)
{
// here I need to cast e to a MouseEvent *
// I want to get rid of this.
MouseEvent *me = (MouseEvent *)e;
}
當調用dispatchEvent,調用者必須通過IEvent派生類的MouseEvent的考試ple:
// dispatching an Event
EventManager::dispatchEvent(Event_MouseMove, new MouseEvent());
我的問題與回調方法有關。 說你想監聽的MouseEvent,該對象將有一個像這樣的方法:
void eventHandler(MouseEvent *event);
的問題是,回調不能因爲它期待一個IEvent *,而不是傳遞給的addListener方法MouseEvent *。爲了使其工作,我只使用IEvent類型,然後事件處理程序方法必須將該IEvent *轉換爲它所期望的派生類型;在這種情況下是MouseEvent *。 我該如何讓addListener方法將一個指針指向將接收任何IEvent派生類的方法?
作爲一個例子:
// add an event listener
EventManager::addListener(Event_MouseMove, std::bind(&Obj::callback, this, std::placeholders::_1));
// the callback method
void Obj::callback(MouseEvent *e) { ... }
// dispatching an Event
EventManager::dispatchEvent(Event_MouseMove, new MouseEvent());
既然你說'std :: function',我敢打賭,你可以安全地寫'>>>',沒有空格。 – 2012-03-24 21:01:15
什麼是eventID和它如何連接到事件類型? – 2012-03-24 21:25:06
eventID是一個唯一的標識符,它是一個int用作回調映射的鍵。 – dotminic 2012-03-24 21:47:48