c++枚举类——从底层_type初始化
C++ enum class - initialization from underlying_type
我想在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
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 初始化有关Google C 样式指南的静态字符串(C-Type或STD :: String)
- 字符串初始化失败:"expression must have integral or unscoped enum type"
- C++类初始化语法和错误"does not name a type"
- 使用公共类函数初始化节点类型<Type>指针C++
- 没有用于初始化'value type'的匹配构造函数
- ' auto x = type{…} '初始化语法和'显式'转换操作符- clang vs gcc
- 没有用于初始化'type'的匹配构造函数
- 为什么第二次初始化工作,而第一次初始化由于"element type does not match"而失败?
- 如何轻松初始化'double data type'为 -1 或 0 的第二个数组元素