使用模板化代码前向声明类

Forward declaring class with templated code

本文关键字:声明 代码      更新时间:2023-10-16

我正在尝试在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,而不需要转发任何消息:

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 类是模板化的,因此我受到限制。这限制了我向前声明消息处理程序类。

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