c++ - 抽象/重构此开关/案例的好方法是什么?

标签 c++ templates protocol-buffers

在一个项目的源代码中,我看到一个 300 行的 switch/case 子句。但它的结构非常好,因为每个案例都是这样的:

        case X:
        {
            msg_type_for_X msg;

            if (msg.ParseFromArray (m_readBuffer))
                recv_X (msg);
        }
            break;

这让我想把它写成 20 行。这里对于每个案例 X,类 msg_type_for_X 是由 protobuf 定义的类。对我来说这似乎很棘手,因为编译器无法知道 msg 的类型。那么人们将如何重构这样的东西呢?或者人们只是不管它?

最佳答案

您可以在宏中使用 token 粘贴。看here .

它会是这样的:

#define CASE_MSG(X) \
    case X: \
    { \
        msg_type_for_##X msg; \
        if (msg.ParseFromArray (m_readBuffer)) \
            recv_##X (msg); \
    } \
    break;

还有其他方法可以做这种事情,并且有一个 msg_type_for_X 结构数组,您将它们全部初始化,然后您甚至不需要使用 case:

if (messages[X].ParseFromArray(m_readBuffer))
       messages[X].recv(msg);

当然,它需要一些重构才能将 recv_X 作为消息解析器的方法包含在内。

关于c++ - 抽象/重构此开关/案例的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22993454/

相关文章:

c++ - 如何检查当前在 OpenGL 中绑定(bind)了哪个帧缓冲区对象?

C++ 将带有指针的对象添加到 Vector 中

c++ - 使用 GL_RGB 格式抓取 Mac OS 屏幕

c++ - 如何在 C++ 中根据函数模板类型应用不同的#define?

c++ - 模板化无分支 int 最大/最小函数

C++ 使用来自 CRTP 模板-模板基类的构造函数

java - 如何通过给定的消息类型名称和原始字节获取 Java 对象的 protobuf?

C++ 多线程应用程序永远挂起

c# - Google Protocol Buffer 不为 C# 编译

java - 协议(protocol)消息包含无效标签 0