c++ - 如何根据一对枚举的值选择一个 Action ?

标签 c++ software-design

我正在用 C++ 实现一个协议(protocol)模型(特别是缓存一致性协议(protocol),但这对这个问题无关紧要)

协议(protocol)有两个值:previous_statemessage_type。两者都是枚举。协议(protocol)应该为两个输入的每个组合选择一个唯一的 Action 。一些组合无效(应该显示错误),一些组合要停止。

用 C++ 编写上述场景的好方法是什么?我可以想到:两个嵌套的开关 block 来选择输入组合,并调用作为函数实现的特定操作。 p>

有没有更优雅、更灵活的方式来编写上述场景?理想情况下,从协议(protocol)中添加/删除输入组合应该很容易。

感谢您的任何建议。 (我是设计模式的新手,不知道适合这里的任何内容)

最佳答案

让我们假设这两个枚举是 32 位值。我会做这样的事情:

void doit(E1 previous_state, E2 message_type) {
# define COMBINE(_x_, _y_) (static_cast<int64_t>(previous_state) << 32 | message_type)
  switch (COMBINE(previous_state, message_type) {
  case COMBINE(e1value1, e2value1):
    // ...
    break;
  case COMBINE(e1value4, e2value3):
    // ...
    break;
  // ... more cases ...
  default:
    // report error
  }
}

不要假设这会生成更快的代码——switch 语句通常被优化为跳转表,但像这样的技巧可能会打败它。如果您最感兴趣的是最佳性能,则必须进行试验并找出最适合您系统的性能(请注意,将 int64_t 更改为较小的类型并最小化我示例中的偏移可能会产生一些影响)。

关于c++ - 如何根据一对枚举的值选择一个 Action ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15996673/

相关文章:

c++ - istringstream operator>> 返回值如何工作?

c++ - 如何格式化带有前导零和四舍五入小数的 double

java - 迭代集合时的数据累积设计

architecture - 配置优先级 - 最佳实践

java - 删除特定监听器

php - 如何在 PHP 7.4 中使用 DocBlocks?

c++ - 创建包装器类而不是从头开始设计是不是 C++ 中糟糕的软件架构?

c++ - OpenGL OBJ 加载器错误 : EXC_BAD_ACCESS code = 1

c++ - “lambda capture”在常规功能上吗?

c++ - Shared_ptr 的输入迭代器