我想知道是否有任何聪明的技巧如何安全地将整数转换为枚举。在你投票说这是重复的之前,我不是在问如何转换(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)扩展性不太好。我可能会把一些宏放在一起,使这更容易,但它仍然看起来愚蠢。
那么,有没有“标准”的方法呢?
1条答案
按热度按时间omhiaaxx1#
如果您不需要同时转换数字值,我建议您使用以下方法
这至少可以防止一些常见的错误,比如忘记更改大小写或返回值,或者只是查找错误的数值。它也更易于重构(考虑更改数值-毕竟您定义了一个枚举,这样您就不必在多个位置更改值)。
不幸的是,这仍然不是很好,但这是我所知道的最好的方法。除非你想用X macros。