Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从整数转换为枚举值时,如何以及在何处检查错误?_C++_Templates_Enums - Fatal编程技术网

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++的一种方式。如果你想在没有枚举值匹配的情况下抛出异常,那么,为它做一个类;然后不需要枚举,只是一个有效的私有向量。(可能不是连续的)值。或其他特征。