安全地将int转换为enum

Safely convert int to enum

本文关键字:enum 转换 int 安全      更新时间:2023-10-16

我想知道是否有任何聪明的技巧如何安全地将整数转换为enum。在你投票认为这是重复的之前,我并没有问如何转换(int i; Enum e = static_cast<Enum>(i)很容易)。我问的是如何安全地完成它,验证结果值确实在enum中。

代码

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)不能很好地缩放。我也许可以把一些宏放在一起使它更容易,但它仍然看起来很愚蠢。

有什么标准吗?怎么做呢?

如果您不需要转换数值,我建议使用

switch (i)
{
    case static_cast<int>(E::A):
    case static_cast<int>(E::B):
        return static_cast<E>(i);
    default:
        throw invalid_argument("");
}

至少可以防止一些常见的错误,比如忘记更改大小写或返回值,或者只是查找错误的数值。而且它更易于重构(考虑改变数值——毕竟你定义了一个enum,所以不必在多个地方改变值)。

不幸的是,这仍然不是很好,但这是我知道的最好的方法。除非你想使用X宏