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

C++ C++;枚举类-从基础类型初始化,c++,c++11,enums,C++,C++11,Enums,我想从C++11中的强类型枚举的底层类型初始化它,这是我从序列化流中读取的一个值,我必须检查它是否有正确的数字范围 比如: enum class MyEnum { FOO, BAR }; MyEnum test = static_cast<MyEnum>(1); enum类MyEnum{ 富,酒吧 }; 髓鞘试验=静态铸型(1); 这与预期的一样有效,但问题是: MyEnum test2 = static_cast<MyEnum>(42); MyEnum

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

比如:

enum class MyEnum {
    FOO, BAR
};

MyEnum test = static_cast<MyEnum>(1);
enum类MyEnum{
富,酒吧
};
髓鞘试验=静态铸型(1);
这与预期的一样有效,但问题是:

MyEnum test2 = static_cast<MyEnum>(42);
MyEnum test2=static_cast(42);
也可以工作,不显示错误。就我所见,enum类也没有关于如何检查输入是否有效的边界或其他指标的概念。在“旧式”枚举中,我们将包含一个最小值和最大值,并与之进行比较,但将这些值添加到强类型枚举中会再次将无效值添加到此类型,从而破坏其用途

有没有办法在值超出范围的情况下检查边界或强制出错

更新:

我刚刚尝试了std::numeric_limits,但这也不适用于枚举类:

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

cout目前无法提取枚举的最小或最大枚举数,但提出了足够多的新类型特征来实现一个可以实现这一点的库。反思小组对此很感兴趣,但要求作者提出一个更明确地推广到其他反思功能的建议。我相信这是该推广的结果,并将在下周的会议上讨论。

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

示例:

enum class MyType : uint8_t
{
    eType1    = 0,
    eType2    = 1,
    COUNT,
    MAXVAL    = std::numeric_limits<decltype(COUNT)>::max()
};
enum类MyType:uint8\t
{
eType1=0,
eType2=1,
计数
MAXVAL=std::数值限制::max()
};
MAXVAL=255

enum class MyType
{
    eType1    = 0,
    eType2    = 1,
    COUNT,
    MAXVAL    = std::numeric_limits<decltype(COUNT)>::max()
};
enum类MyType
{
eType1=0,
eType2=1,
计数
MAXVAL=std::数值限制::max()
};

MAXVAL=2147483647

如果您尝试MyEnum test2=static_cast(42),会发生什么?似乎是行为的重复(在gcc 4.6.2上)对于unsigned int也是一样的。我可以使用“cout”输出枚举。不幸的是,枚举类不支持用户定义的方法或构造函数。因此,我能想象到的最干净的事情是检查值并返回枚举的独立方法:
MyEnum MyEnumFromValue(int v){…} /COD>枚举的基础类型是“代码> int <代码> >。在 int >代码范围内的任何值对于C++是有效的。如果您希望检查范围有限,则必须将其实现为类类型。谢谢,这是“当前不可能”的一个很好的答案。“情况。这些文档确实很有趣,让我们看看何时/是否可以获得。无论您的答案是什么,最好通过添加一些描述来改进它。请按照了解方法的说明进行操作。”。