使用模板代码转发声明 class

Forward declaring class with templated code

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

我正在寻找一种构建文件的方法,以便能够省略前向声明。

我知道我可以使用包含所有可用消息的元组来模板化 MessageHandler class。但是,我发现这不够简单,正在寻找更简单 - 可解释 - 的方法。

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 多条消息。我可以接受处理程序的冗长 class,前向声明有点 "much".

有什么方法可以重组它吗?当然,由于 MessageHelper class 是模板化的事实,我受到了限制。这限制了我向前声明 MessageHandler class。

谢谢!

你不能完全摆脱前向声明,但你可以改变顺序,这样你只需要前向声明MessageHandler和none消息:

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));
}

I'm limited due to the fact that the MessageHelper class is templated. This restricts me in forward declaring the MessageHandler class instead.

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