c++ - 如何创建基于类型的查找表以在 C++ 中实现多重调度?

标签 c++ function-pointers overloading dispatch

我正在尝试创建一个消息传递系统,其中派生自“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/

相关文章:

c++ - 函数指针未分配到函数指针数组中

C++ : What are the purpose of captures in lambda expressions?

c++ - 表示嵌套的 C++ 模板

c - 如何在纯 C 中包装函数指针

javascript - 为什么可以在 javascript 中减去 Date 对象?是否有任何形式的运算符重载?

javascript - 使用内部函数重载 JS 插件函数

c++ - 使用 std::function 参数重载函数:为什么从未调用 const 方法?

c++ - 在 linux 中为 c++ dev 配置 VSCode

c++ - Win XP x64 上的段错误在 XP x32 上不会发生 - strncpy 问题?怎么修?

c++ - 我可以推断作为模板参数传递的函数的返回类型吗?