我正在尝试创建一个消息传递系统,在该系统中,从“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。

09-06 12:27