0

我正在尝试为 C++ 中的消息接口实现双重调度模式。但是,我发现由于必须转发声明每条消息,我必须在处理程序类中过于冗长。

我正在寻找一种方法来构造文件以省略前向声明。

我知道我可以使用所有可用消息的元组来模板 MessageHandler 类。然而,我发现这不够简单,并寻找更简单 - 可解释 - 方法。

struct MessageA;
struct MessageB;
// etc...

class MessageHandler {
public:
    virtual void handle(MessageA& m);
    virtual void handle(MessageB& m);
    // etc...

    virtual void handle(Message&) {}

};

struct Message {
    virtual void dispatch(MessageHandler&) = 0;
};

template<typename ActualMessage>
struct MessageHelper : Message {
    void dispatch(MessageHandler& handler)
    {
        handler.handle(static_cast<ActualMessage&>(*this));
    }
};


struct MessageA : MessageHelper<MessageA> {};
struct MessageB : MessageHelper<MessageB> {};
// etc...

在实际代码中,我处理了 20 多条消息。我对处理程序类的冗长没意见,前向声明有点“多”。

有什么办法可以重组这个吗?当然,由于 MessageHelper 类是模板化的,因此我受到了限制。这限制了我转发声明 MessageHandler 类。

谢谢!

4

1 回答 1

0

您不能完全摆脱前向声明,但您可以更改顺序,以便您只需要前向声明而不需要MessageHandler任何消息:

struct MessageHandler;

struct Message {
    virtual void dispatch(MessageHandler&) = 0;
};

template<typename ActualMessage>
struct MessageHelper : Message {
    void dispatch(MessageHandler& handler);
};


struct MessageA : MessageHelper<GetDeviceConfig> {};
struct MessageB : MessageHelper<GetDeviceConfig> {};
// etc...

class MessageHandler {
public:
    virtual void handle(MessageA& m);
    virtual void handle(MessageB& m);
    // etc...

    virtual void handle(Message&) {}
};

template<typename ActualMessage>
void MessageHelper<ActualMessage>::dispatch(MessageHandler& handler)
{
    handler.handle(static_cast<ActualMessage&>(*this));
}

由于 MessageHelper 类是模板化的,我受到了限制。这限制了我转发声明 MessageHandler 类。

目前尚不清楚为什么您认为MessageHelper模板化会限制您向前声明MessageHandler.

于 2019-07-21T19:11:40.170 回答