c++ - 通用消息调度库?

标签 c++

有没有一种标准的方法可以去除读取循环中的 switch/case block ?

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
}

并将该类型的对象传递到消息循环可以看到的地方,并要求他回调这些对象。

一个问题是,即使我只想为单一类型实现和注册一个处理程序,我也必须从此类继承。 另一个是这看起来很难看。

我想知道是否有现有的库可以处理这个问题(应该是免费的)。或者没有比这样做更好的方法了吗?

最佳答案

其他避免继承的方法是:

  1. 对于一个封闭类型集:

    使用变体:

    variant<message1_t, message2_t> my_message;
    

    有了访客,您可以完成剩下的工作。我推荐 boost.variant。

  2. 您还可以使用 boost::any,用于一组开放的类型,并在运行时复制消息。不过,在某些时候您将不得不转换回原始类型。

  3. 另一个解决方案与 Poco.DynamicAny 类似,它将尝试转换为赋值左侧的类型,类似于动态语言。但是您需要自己为您的类型注册转换器。

关于c++ - 通用消息调度库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26541967/

相关文章:

c++ - freeglut 中的 glutidlefunc() 有什么意义

c++ - 整数类型转换错误?

c++ - 获取文件信息到变量?

c++ - 避免将 header 重新声明为源文件

c++ - 如何使用 std::in 和 getline() 在后台进程中检测从 bash 注入(inject)的输入

c++ - 为什么 while(int) 在 int = 0 时结束?

c++ - 将 char* 隐式转换为我的字符串

c++ - 需要指针时在参数列表中实例化类

c++ - 当我在 C++ 中使用 auto bi = 123456789 时,它是否总是分配为 int?

c++ - 在 std::move() 之后删除堆上的结构成员