使用模板代码转发声明 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
。
我正在尝试为 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
。