C++ 从整数转换为枚举值时,如何以及在何处检查错误?
假设我有一个枚举类C++ 从整数转换为枚举值时,如何以及在何处检查错误?,c++,templates,enums,C++,Templates,Enums,假设我有一个枚举类 enum class Sectors { A = 1, B, C, D, E, F, G, H }; 我需要从文件中读取数据,将数字数据分配给扇区类型的变量。 我使用这个模板函数将整数转换为枚举值 template <typename Enumeration, typename NumType> Enumeration NumericToEnum(NumType const value) { return stati
enum class Sectors {
A = 1, B, C, D, E, F, G, H
};
我需要从文件中读取数据,将数字数据分配给扇区类型的变量。
我使用这个模板函数将整数转换为枚举值
template <typename Enumeration, typename NumType>
Enumeration NumericToEnum(NumType const value) {
return static_cast<Enumeration>(value);
};
模板
枚举NumericToEnum(NumType常量值){
返回静态_cast(值);
};
有没有办法检查给定的数值是否实际在给定的枚举范围内
Sectors sec1 = NumericToEnum<Sectors>(intValueFromFile); //ok when 2
Sectors sec2 = NumericToEnum<Sectors>(999); //error, out of range
sections sec1=NumericToEnum(intValueFromFile)//好的,当2
扇区sec2=数值(999)//错误,超出范围
我知道如何在传递到函数(value>=Sectors::A&&value之前进行检查。您可以定义其他
enum
值来指定范围:
enum class Sectors {
A = 1, B, C, D, E, F, G, H,
SEC_MIN = A, SEC_MAX = H
};
并使用断言进行检查
:
template <typename Enumeration, typename NumType>
Enumeration NumericToEnum(NumType const value) {
assert((value >= Enumeration::SEC_MIN && value <= Enumeration::SEC_MAX),"value must be in valid range");
return static_cast<Enumeration>(value);
};
模板
枚举NumericToEnum(NumType常量值){
断言((value>=Enumeration::SEC_MIN&&value这个问题经常被问到。据我所知,没有内置的解决方案来确定任意整数是否在特定数组的范围内。您可以自己编写代码,但这不是一件小事。它要求您为每个枚举专门化它,或者添加sentinel值将枚举添加到所有枚举中。即使如此,您也必须记住,枚举并不要求其所有成员都具有顺序整数ID。枚举是定义常量的一种方法。命名枚举是使用名称范围内的某些常量的一种方法。使用枚举的一个很好的理由是避免“野生”某些函数中的值,只允许枚举中定义的。尝试将整数转换为枚举不是一个好的设计。除了混淆代码外,它还容易出错。@Ripi2我同意这不是一个好的设计,但是如果您想在字段中存储一个具有整数值的结构,然后从文件中读取它,您将得到它问题。另一个问题是:你能通过从文件中读取枚举值来创建它吗?并确保它在范围内,即使文件已损坏。@Ripi2如果我想使用只能保存某些预定义值的类型的变量,有什么替代方法呢?我发现重载一些变量非常方便和漂亮运算符用于枚举,然后做“<代码> >(扇区S=扇区:A,你可能发现)“方便和漂亮”。我会发现它是滥用C++的一种方式。如果你想在没有枚举值匹配的情况下抛出异常,那么,为它做一个类;然后不需要枚举,只是一个有效的私有向量。(可能不是连续的)值。或其他特征。