Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 安全地将int转换为enum_C++_C++11_Enums - Fatal编程技术网

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

C++ 安全地将int转换为enum,c++,c++11,enums,C++,C++11,Enums,我想知道是否有什么聪明的技巧可以安全地将整数转换为枚举。在您投票认为这是重复之前,我不是在问如何转换(int I;Enum e=static_cast(I)很容易)。我在问如何安全地执行此操作,验证结果值是否确实在枚举中 以下代码 enum class E { A = 1, B = 2 }; int main(int, char **) { int i = 3; E e = static_cast<E>(i); } 1)看起来不太聪明2)伸缩性不太

我想知道是否有什么聪明的技巧可以安全地将整数转换为枚举。在您投票认为这是重复之前,我不是在问如何转换(
int I;Enum e=static_cast(I)
很容易)。我在问如何安全地执行此操作,验证结果值是否确实在枚举中

以下代码

enum class E {
    A = 1,
    B = 2
};

int main(int, char **) {
    int i = 3;
    E e = static_cast<E>(i);
}
1)看起来不太聪明2)伸缩性不太好。我可能会把一些宏放在一起,使这更容易,但它仍然看起来很愚蠢

那么,有什么“标准”的方法可以做到这一点吗


谢谢

如果您不必同时转换数值,我建议您执行以下操作

switch (i) {
    case 1:
        return E::A;
    case 2:
        return E::B;
    default:
        throw invalid_argument("");
}
switch (i)
{
    case static_cast<int>(E::A):
    case static_cast<int>(E::B):
        return static_cast<E>(i);
    default:
        throw invalid_argument("");
}
开关(一)
{
case static_cast(E::A):
案例静态类型(E::B):
返回静态_-cast(i);
违约:
抛出无效的参数(“”);
}
至少这可以防止一些常见的错误,比如忘记更改大小写或返回值,或者只是查找错误的数值。而且它对重构更加友好(考虑更改数值——毕竟您定义了一个枚举,这样就不必在多个地方更改值)


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

也许有帮助?(使用类枚举确保只允许指定的值,AFAIK),除非您有办法获得枚举大小(例如
enum类e{a=0,B,enum_COUNT}
,其中
ENUM_COUNT
将给出
2
,且枚举为正且从0开始递增,则答案为否。枚举非常原始。请参阅关于克服这些问题的许多其他问题。一些基于宏的方法很好,我忍不住插入我自己的问题,其中包含一些有用的答案和建议C++程序并不是要对它们的内容“吓唬”的,只有预成型的盲代码如何验证一个值还取决于枚举的预期用途。技术上,<代码> a b < /COD>对于你的枚举来说是一个有效的值(但可能不是应用程序)。“我正在问如何安全地做它,验证结果值确实在枚举中。”你使用的是C++标准和编译器不同意的“安全”的个人定义。对于一个枚举类型的值,它没有对应于该类型的枚举器的一个“不安全”。然后
E{1}
是一个有效的值,而且非常“安全”。如果你想要一个只能接受特定值的类型,那么你不应该使用枚举类型。呵呵,我没有想到。非常难看,但可能是最好的方法。谢谢。X宏看起来…很有趣。我不确定是否喜欢它,但它也可能有用。