我正在尝试创建一个消息传递系统,在该系统中,从“Messageable”派生的任何类都可以根据函数handleMessage()重载的方式接收消息。例如:
class Messageable {
public:
void takeMessage(Message& message) {
this->dispatchMessage(message);
}
protected:
void bindFunction(std::type_info type, /* Need help here */ func) {
m_handlers[type] = func;
}
void dispatchMessage(Message& message) {
m_handlers[typeid(message)](message);
}
private:
std::map<std::type_info, /*Need help here*/ > m_handlers;
};
class TestMessageable : public Messageable {
public:
TestMessageable() {
this->bindFunction(
typeid(VisualMessage),
void (TestMessageable::*handleMessage)(VisualMessage));
this->bindFunction(
typeid(DanceMessage),
void (TestMessageable::*handleMessage)(DanceMessage));
}
protected:
void handleMessage(VisualMessage visualMessage) {
//Do something here with visualMessage
}
void handleMessage(DanceMessage danceMessage) {
//Do something here with danceMessage
}
};
简而言之,我希望基于任何给定消息的RTTI值调用正确的handleMessage版本。
我最好如何在没有某种整体式开关/案例声明的情况下实现此功能。
最佳答案
您应该查看Double Dispatch模式。查看信息here。
您应该能够将VisualMessage像这样实现:
class VisualMessage : public Message
{
public:
virtual void dispatch(Messageable & inMessageable)
{
inMessageable.handleMessage(*this);
}
};
然后这样称呼它:
Message & vMessage = VisualMessage();
Messageable & tMessageable = TestMessageable();
vMessage.dispatch(tMessageable);
然后它将调用TestMessageable::handleMessage(VisualMessage&visualMessage)
这是因为Message::dispatch将基于VisualMessage类型。然后,当VisualMessage::dispatch调用inMessageable.handleMessage(* this)时,它将调用正确的handleMessage,因为* this指针的类型是VisualMessage,而不是Message。