使用模板化代码前向声明类
Forward declaring class with templated code
我正在尝试在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
。
相关文章:
- 我的代码中有错误,未声明的标识符
- 在多个头文件中从接口声明被覆盖的函数时,如何避免重复代码?
- 我如何在一个 if 语句中声明所有数字我尝试通过其他方式声明所有数字,如果一个接一个,但似乎代码有逻辑错误
- 代码作为 C 文件工作,但不作为C++文件,错误:'__builtin_types_compatible_p'未在此范围内声明
- 在C++代码中使用的 C 标头中向前声明枚举
- C++代码中奇怪的未使用的静态字符串声明
- 如何将char数组声明为函数参数?或告诉我此代码中还有其他问题?
- 使用模板化代码前向声明类
- 这是有效的C++代码吗?(在声明范围之外使用本地类型)
- 如何使用声明类型简化此代码
- 模板函数声明为 void - 代码不起作用?
- 代码块编译错误.Cin 未在此范围内声明
- 模板化友元声明在 G++ 5.4.0 下不起作用 - 编译器错误或错误代码
- 无法使用在模板化基类 [C++] 中声明的枚举编译代码
- 以下代码运行后,如何在程序再次运行之前清除用户声明的变量 empName
- 声明原型时如何在主代码块中调用函数
- 声明全局变量 <vector>,代码将无法成功运行
- 错误:"stoi"未在此范围内声明(代码::Windows 10 上的块 16.01)
- Stoi未在作用域中声明-代码::块
- 错误:我的每个函数和变量都没有在这个范围内声明(代码;;块,C++)