C ++枚举类 - 从underlying_type初始化

时间:2014-06-12 12:19:57

标签: c++ c++11 enums

我想从其基础类型初始化C ++ 11中的强类型枚举,这是我从序列化流中读取的值,我必须检查正确的数字范围。

类似的东西:

enum class MyEnum {
    FOO, BAR
};

MyEnum test = static_cast<MyEnum>(1);

这可以按预期工作,但问题是:

MyEnum test2 = static_cast<MyEnum>(42);

也可以工作,并且不会显示错误。据我所知,枚举类也没有任何关于如何检查输入是否有效的界限或其他指标的概念。在&#34;旧式&#34;枚举,我们将包含MIN和MAX值并与之进行比较,但将这些值添加到强类型枚举中会再次向此类型添加无效值,从而破坏其目的。

如果值超出范围,我是如何检查边界或强制错误的?

更新

我刚试过std :: numeric_limits,但这对enum类也不起作用:

cout << static_cast<unsigned int>(numeric_limits<MyEnum>::min()) << endl;
cout << static_cast<unsigned int>(numeric_limits<MyEnum>::max()) << endl;

都返回0。

2 个答案:

答案 0 :(得分:6)

目前无法提取枚举的最小或最大枚举数,但http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3815.html提出了足够的新类型特征来实现可以执行此操作的库。反思小组很感兴趣,但要求作者回过头来提出更明确地推广到其他反思特征的提案。我相信http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4027.pdf是这种概括的结果,它将在下周的会议上讨论。

答案 1 :(得分:0)

std :: numeric_limits返回枚举的最大可能值(取决于数据类型),而不是现有的最大枚举值。

示例:

enum class MyType : uint8_t
{
    eType1    = 0,
    eType2    = 1,
    COUNT,
    MAXVAL    = std::numeric_limits<decltype(COUNT)>::max()
};

MAXVAL = 255

enum class MyType
{
    eType1    = 0,
    eType2    = 1,
    COUNT,
    MAXVAL    = std::numeric_limits<decltype(COUNT)>::max()
};

MAXVAL = 2147483647