c++枚举类——从底层_type初始化

C++ enum class - initialization from underlying_type

本文关键字:type 初始化 枚举 c++      更新时间:2023-10-16

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

类似:

enum class MyEnum {
    FOO, BAR
};
MyEnum test = static_cast<MyEnum>(1);

按预期工作,但问题是:

MyEnum test2 = static_cast<MyEnum>(42);

也可以工作并且不显示错误。据我所知,枚举类也没有任何关于如何检查输入是否有效的边界或其他指示符的概念。在"旧式"枚举中,我们会包含一个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;

目前没有办法提取枚举的最小或最大枚举数,但是http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3815.html提出了足够多的新类型特征来实现可以做到这一点的库。Reflection小组对此很感兴趣,但要求作者提出一个更清楚地概括到其他反射特性的建议。我相信http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4027.pdf就是这种概括的结果,它将在下周的会议上得到讨论。

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

例子:

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