通用消息调度库
generic message dispatching library?
是否有标准的方法来消除读循环中的switch/case块?
即
enum msg_type
{
message_type_1,
//msg types
}
struct header
{
msg_type _msg_type;
uint64_t _length;
}
struct message1
{
header _header;
//fields
}
struct message2
{
header _header;
//fields
}
//socket read loop
void read(//blah)
{
//suppose we have full message here
char* buffer; //the buffer that holds data
header* h = (header*)buffer;
msg_type type = h->_msg_type;
switch(type)
{
case msg_type_1:
message1* msg1 = (message1*)buffer;
//Call handler function for this type
//rest
}
}
这意味着我必须从处理程序容器基类继承,该基类的形式为:
class handler_container_base
{
public:
virtual void handle(message1* msg){}
virtual void handle(message2* msg){}
//etc
}
并将该类型的对象传递到消息循环可以看到的位置,并要求他回拨这些对象。
一个问题是,即使我只想为一个类型实现和注册一个处理程序,我也必须从这个类继承。另一个是这看起来很难看。
我想知道是否有处理这个问题的现有库(应该是免费的)。或者没有比这样更好的方法了吗?
其他避免继承的方法有:
-
对于一组封闭类型:
使用变体:
variant<message1_t, message2_t> my_message;
有访客,你可以做剩下的。我推荐boost.variant.
-
您还可以对一组打开的类型使用boost::any,并在运行时复制消息。不过,在某些情况下,您将不得不转换回原始类型。
-
另一个解决方案遵循Poco.DynamicAny的思路,它将尝试转换为赋值中左侧的类型,类似于动态语言。但是您需要自己为您的类型注册转换器。
相关文章:
- boost::进程间消息队列引发错误
- 如何在c++中实现处理器调度模拟器
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何通过参数抛出错误消息
- 从服务器传输到客户端的消息不会出现
- ROS2 动态消息模板
- C++秘密消息学校作业
- glad 导致 glfwSwapBuffers 返回错误消息
- C++入门 5 版:类消息和文件夹
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 正确调度消息 UART
- 设置钩子时翻译消息和调度消息的目的WH_KEYBOARD_LL
- 是否可以捕获翻译/调度消息循环中的窗口消息/事件
- 通用消息调度库
- Wine user32消息调度