C++枚举类 - 从基础类型进行初始化

7
我希望在C++11中从序列化流中读取枚举类型的基础类型,并对其进行正确的数值范围检查,以初始化强类型枚举。类似于以下代码:
enum class MyEnum {
    FOO, BAR
};

MyEnum test = static_cast<MyEnum>(1);

这个功能能正常工作,但存在一个问题:
MyEnum test2 = static_cast<MyEnum>(42);

这也可以正常工作,并且没有指示错误的迹象。就我所见,枚举类也没有任何关于边界或其他指标的概念,以便检查输入是否有效。在“旧式”枚举中,我们将包括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;

两者都返回0。


如果你执行 enum class MyEnum: unsigned int { FOO = 1, BAR = 2 }; 然后尝试执行 MyEnum test2 = static_cast<MyEnum>(42);,会发生什么? - shuttle87
似乎是 https://dev59.com/Pl3Va4cB1Zd3GeqPA377?lq=1 的重复。 - dragosht
行为(在gcc 4.6.2上)对于无符号整数是相同的。我可以使用“cout << static_cast<unsigned int>(test);”输出枚举并得到42,所以它只是分配而没有任何检查。 - VolkA
1
不幸的是,枚举类不支持用户定义的方法或构造函数。因此,我能想到的最简洁的方法就是一个独立的方法,它检查值并返回一个枚举:MyEnum MyEnumFromValue(int v) {...} - Matthias247
3
你的枚举类型底层是 int。在 C++ 中,任何在 int 范围内的值都是有效的。如果你想要一个有限范围并进行检查的话,你需要将其实现为一个类类型。 - Cheers and hth. - Alf
显示剩余2条评论
2个回答

6

谢谢,这是一个很好的回答,针对“目前不可能”的情况。这些文档确实很有趣,让我们看看这是否会变得可用。 - VolkA

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()
};

最大值 = 2147483647


2
无论您的答案是什么,添加一些描述来改进它会更好。请点击此链接了解如何回答问题:https://stackoverflow.com/help/how-to-answer - Yuriy Tsarkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接