c++ - 是否可以从多个模板特化生成自动 `switch()` 指令?

标签 c++ templates

我正在实现一种协议(protocol),其中一台主机可以接收单字节命令。

虽然一个字节有 256 个可能的值,但其中只有少数是有效的。

当然我可以这样写:

bool is_valid(uint8_t command)
{
  switch (command)
  {
    case 0x00:
    case 0x01:
    case 0xa0:
    case 0xa1:
      return true;
  }

  return false;
}

在运行时检查接收到的命令的有效性。

不幸的是,我还必须为这些命令中的每一个维护一个名称列表,这将迫使我编写另一个非常接近 is_valid() 但会返回名称的函数命令的代替。这样做会使我复制有效命令列表,我不喜欢这样。

我想知道是否有一种方法可以使用元编程只声明一次有效命令。

类似于:

template <uint8_t Value>
struct valid_value_type;

struct valid_value_type<0x00> { static const std::string name = "Stop command"; };
struct valid_value_type<0x01> { static const std::string name = "Start command"; };

但是,我无法达到任何令人满意的效果(理解“编译和工作”),而且我不知道如何生成一个自适应的 is_valid() 函数来自动考虑这些的存在模板声明。

这可能吗?如果是这样,你会怎么做?

注意:很遗憾,C++11 不是一个选项,但出于好奇,我也对解决方案很感兴趣。

最佳答案

除非您处于嵌入式环境中,否则 uint8_t 只有 256 个可能的值,因此用它编写查找表并不可怕...

char const * cmds[256] = {};
void cmds_init(char const * (&cmds)[256]) {
   cmds[0x00] = "Stop command";
// ...
}

然后对有效命令的测试只是在查找表中找到名称:

bool is_valid(uint8_t cmd) {
   return cmds[cmd] != 0;
}

如果有效命令的数量远小于 256,您可以实现一个使用开关返回名称的函数,如果命令未知则返回 null,并使用相同的方法。

关于c++ - 是否可以从多个模板特化生成自动 `switch()` 指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15210138/

相关文章:

c++ - 无状态 lambda 作为静态局部变量

c++ - 避免内联显式实例化的 std::vector<T> 代码? ( Visual Studio C++ 2008)

django - 如何使用 Django FileFields 在模板中显示当前文件

c++ - 为什么此模板参数推断失败?

c++ - 重载运算符的返回值分段失败

c++ - 我正在尝试访问 float 中的各个字节,但得到了意想不到的结果

c++ - 如何在 C++ 中读取/写入应用程序的内存

c++ - 有两个不同版本的箭头运算符?

c++ - 将 int 21h 与内联汇编一起使用

c++ - 使用 makefile 将 C++ 文件编译为 objective-c++