関数 handleMessage() のオーバーロード方法に基づいて、「Messageable」から派生したクラスがメッセージを受信できるメッセージング システムを作成しようとしています。例えば:
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 ステートメントを使用せずに、これを実装するにはどうすればよいでしょうか。