我正在读取enum二进制文件中的值,并想检查该值是否真的是enum值的一部分.我该怎么做?
#include <iostream>
enum Abc
{
A = 4,
B = 8,
C = 12
};
int main()
{
int v1 = 4;
Abc v2 = static_cast< Abc >( v1 );
switch ( v2 )
{
case A:
std::cout<<"A"<<std::endl;
break;
case B:
std::cout<<"B"<<std::endl;
break;
case C:
std::cout<<"C"<<std::endl;
break;
default :
std::cout<<"no match found"<<std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
我是否必须使用switch操作员或有更好的方法吗?
编辑
我设置了枚举值,不幸的是我无法修改它们.更糟糕的是,它们不是连续的(它们的值为0,75,76,80,85,90,95,100等)
我想从其底层类型初始化C++ 11中的强类型枚举,这是我从序列化流中读取的值,我必须检查正确的数字范围.
就像是:
enum class MyEnum {
FOO, BAR
};
MyEnum test = static_cast<MyEnum>(1);
Run Code Online (Sandbox Code Playgroud)
这按预期工作,但问题是:
MyEnum test2 = static_cast<MyEnum>(42);
Run Code Online (Sandbox Code Playgroud)
也工作,并没有指出错误.据我所知,枚举类也没有任何关于如何检查输入是否有效的界限或其他指标的概念.在"旧式"枚举中,我们将包含MIN和MAX值并与这些值进行比较,但是将这些值添加到强类型枚举中会再次向此类型添加无效值,从而破坏其目的.
任何想法如何检查边界或强制错误,以防值超出界限?
更新:
我刚试过std :: numeric_limits,但这对枚举类也不起作用:
cout << static_cast<unsigned int>(numeric_limits<MyEnum>::min()) << endl;
cout << static_cast<unsigned int>(numeric_limits<MyEnum>::max()) << endl;
Run Code Online (Sandbox Code Playgroud)
都返回0.