安全地将int转换为枚举

时间:2015-07-28 13:06:09

标签: c++ c++11 enums

我想知道是否有任何聪明的技巧如何安全地将整数转换为枚举。在您投票之前,这是重复的,我不是在询问如何转换(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 个答案:

答案 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