我想知道是否有任何聪明的技巧如何安全地将整数转换为枚举。在您投票之前,这是重复的,我不是在询问如何转换(int i; Enum e = static_cast<Enum>(i)
很简单)。我正在问如何安全地进行操作,验证结果值是否真的在枚举中。
以下代码
enum class E {
A = 1,
B = 2
};
int main(int, char **) {
int i = 3;
E e = static_cast<E>(i);
}
将编译(AFAIK),但e
将不包含枚举中的有效值。我提出的最佳方式是
switch (i) {
case 1:
return E::A;
case 2:
return E::B;
default:
throw invalid_argument("");
}
其中1)看起来不太聪明2)不能很好地扩展。我可能会把一些宏放在一起,以使这更容易,但它仍然看起来很愚蠢。
那么有没有“标准”的方法呢?
由于
答案 0 :(得分:5)
如果你不必转换数值,我建议像
switch (i)
{
case static_cast<int>(E::A):
case static_cast<int>(E::B):
return static_cast<E>(i);
default:
throw invalid_argument("");
}
至少可以防止一些常见的错误,例如忘记更改大小写或返回值,或者只是查找错误的数值。此外它更友好的重构(考虑更改数值 - 毕竟你定义一个枚举,以便你不必须在多个地方更改值。)
不幸的是,它仍然不是很好,但它是我所知道的最好的方式。好吧,除非你想使用X macros。