用碱类参数成员函数指针接受派生类的参数
-
19-09-2019 - |
题
所以我在做这个事件管理类。我存储指针到签名void (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*&)
'
你知道我怎么能放心地通过该公司预计,派生类中的函数签名的指针?感谢。
解决方案
所以我发现,似乎是为我工作的一个解决方案,但我不知道这是否是完全安全的做法。我改变了RegisterEventHandler方法铸造的所有函数指针,我发送到相同类型的...
template<typename T1, typename T2>
void RegisterEventHandler(const String& type, T1 handler, T2* obj)
{
void (T2::*evtHandler)(Event*) = (void (T2::*)(Event*)) (handler);
mCallbackList[type].push_back(boost::bind(evtHandler, obj, _1));
}
现在这一切似乎我原本打算只是工作。但我很新的这一切,所以我不能完全肯定,如果这是做一个安全的事情。有什么想法吗?感谢
其他提示
如果您的原型预计“事件”型,那么你需要确保void Display(MouseEvent* evt)
功能接受“Event
”型。因此,将其更改为void Display(Event *evt)
接着,电话里,你可以强制转换回一个MouseEvent
,假设调用者传递的实际MouseEvent
,作为“Event
”。
其次,我相信你可以有你调用RegisterEventHandler
方式其他一些问题,因为它是一个模板,但你没有指定模板类型。
不隶属于 StackOverflow