【发布时间】:2010-02-06 17:29:20
【问题描述】:
所以我正在学习这个事件管理课程。我正在存储一个指向签名 void (Event*) 的成员函数的指针列表,其中 Event 只是一个当前存储一些随机数据的结构。
typedef boost::function<void(Event*)> Callback;
typedef vector<Callback> CallbackList;
class EventManager
{
public:
template<typename T>
void RegisterEventHandler(const std::string& type, void (T::*handler)(Event*), T* obj)
{
mCallbackList[type].push_back(boost::bind(handler, obj, _1));
}
void DispatchEvent(const std::string& type, Event* evt)
{
for(CallbackList::iterator it = mCallbackList[type].begin(); it != mCallbackList[type].end(); ++it)
{
Callback callback = (*it);
callback(evt);
}
}
private:
hash_map<std::string, CallbackList> mCallbackList;
};
我想知道,我是否有可能派生不同版本的事件,并将指向这些成员函数的指针传递给这个类?目前我正在尝试这个。
class MouseEvent : public Event
{
public:
int testMouseData1;
int testMouseData2;
int testMouseData3;
};
class HelloWorld
{
public:
void Display(MouseEvent* evt)
{
cout << "Hello, world!" << endl;
}
};
int main(void)
{
MouseEvent* evt = new MouseEvent();
HelloWorld* world = new HelloWorld();
eventManager->RegisterEventHandler("testType", &HelloWorld::Display, world);
return 0;
}
这给了我 XCode 中的以下错误。
错误:没有匹配函数调用'
EventManager::RegisterEventHandler(const char [9], void (HelloWorld::*)(MouseEvent*), HelloWorld*&)'
你知道我怎样才能安全地传递一个指针,该指针在其函数签名中期望派生类吗?谢谢。
【问题讨论】:
标签: c++ events generics member-function-pointers