我正在实现一个协议,其中一台主机可以接收单字节命令。
虽然一个字节有 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 不是一个选项,但出于好奇,我也对该解决方案感兴趣。