c++ 安全地将int转换为enum

hgqdbh6s  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(198)

我想知道是否有任何聪明的技巧如何安全地将整数转换为枚举。在你投票说这是重复的之前,我不是在问如何转换(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)扩展性不太好。我可能会把一些宏放在一起,使这更容易,但它仍然看起来愚蠢。
那么,有没有“标准”的方法呢?

omhiaaxx

omhiaaxx1#

如果您不需要同时转换数字值,我建议您使用以下方法

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

相关问题