我正在尝试为 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 类。
谢谢!