我正在尝试创建一个消息传递系统,其中派生自“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。
如果没有某种单一的 switch/case 语句,我如何才能更好地实现这一点。
最佳答案
您应该研究一下 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。
关于c++ - 如何创建基于类型的查找表以在 C++ 中实现多重调度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1824835/