设有如下枚举类型定义,枚举类型设定范围
枚举优先于具有有限范围的枚举(C11/14) ——3354—C2.0第4讲_ Blog _ Enumeration具有有限范围的类型
第0篇结论1枚举类型1.1没有范围限制1.2使用命名空间1.3限制范围2优点2.1避免命名空间污染2.2避免隐式类型转换2.3在某些情况下可以进行预声明以减少代码编译。
结论有限选择的枚举类型限制了范围。
限定范围的枚举类型在枚举类型内都是可见的,只能通过强制类型转换为其他类型(减少命名空间污染);范围有限的枚举类型和范围无限的枚举类型都支持基础类型的规范。范围受限枚举类型的默认底层类型是int,而范围无限制枚举类型没有默认类型(避免隐式类型转换);具有有限范围的类型总是可以预声明的,而没有有限范围的枚举类型只能在基础类型是默认类型的情况下预声明(减少重新编译)。
1枚举类型
1.1枚举PostStatus{
SucceedDeal=0,//处理成功
ServerMaintenanceError=1,///服务器维护状态
SeverDisconnectError=2,///网络断开状态
NoPermissionError=3,//没有权限
Abnormalerror=4,//JSON数据异常
dealdatabaserror=5///处理数据库异常
};使用:
STD:cout deal database error;
1.2使用名称空间//post来请求状态
命名空间类型{
//已解析的发布类型
枚举分析发布类型{
WorkModeRequest=0,//工作模式
Token=1,//令牌请求
DownloadComInfoTableRequest=2,//下载商店信息
StockSalesReturnSupportRequest=3,//输入返回权限
StockSalesreturnBreakageOperateRequest=4,//采购、退货和挂失操作
};
}使用:
STD:cout Type:GetChechstandInformationRequest;
1.3限定范围类PostType{
公共:
//执行的发布类型
枚举ExecutePostType{
StockOperate=0,//购买操作
SalesReturnOperate=1,///返回操作
BreakageOperate=2,///挂失操作
Tcommoditystockoperate=3,//拆分操作
};
};使用:
STD:cout post type:DownloadTableOperate;
2.1避免命名空间污染。不使用范围有限的枚举变量:
枚举动物{
猫,狗,乌龟
};
auto cat=true//错误:错误:将“cat”重新定义为不同种类的符号枚举有限范围的变量:
枚举类动物{
猫,狗,乌龟
};
auto cat=false//命名可以重复使用
//动物c=猫;//无法执行隐式类型转换(错误:无法用“bool”类型的左值初始化“animal”类型的变量)
动物c=动物:猫;
2.2避免没有限定范围的枚举类型的隐式类型转换(执行隐式类型转换):
枚举动物{
猫,狗,乌龟
};
如果(第12.5类){
STD:cout 12.5类;
}否则{
std:cout猫;
}限定范围的枚举类型(不能进行隐式类型转换,进行类型转换时需要强制类型转换):
枚举类动物{
猫,狗,乌龟
};
if(Animal:cat 12.5){//错误:二进制表达式的操作数无效(“Animal”和“double”)
STD:cout 12.5类;
}否则{
STD:cout static _ cast int(c);
}对于需要隐式类型转换的情况,可以使用不合格的枚举类型进行操作。
使用UserInfo=std:tuple std:string,STD:string;
枚举UserInfoFields {Name,Age}。
UserInfo uInfo
auto val=STD:get Name(ui info);//隐式类型转换如果使用有限的作用域,会麻烦得多:
使用UserInfo=std:tuple std:string,STD:string;
枚举类UserInfoFields {Name,Age}。
UserInfo uInfo
auto val=STD:get static _ cast STD:size _ t(UserInfoFields:Name)(uInfo);//隐式类型转换的改进版本(因为std:get的参数是模板行参数,所以隐式转换的类型必须在编译时计算):
//隐式类型转换模板
模板类型名E
const expr typename STD:underlying _ type E:type
toUType(E枚举器)noexcept{
返回static _ cast typename STD:underlying _ type E:type(枚举器);
}
使用UserInfo=std:tuple std:string,STD:string;
枚举类UserInfoFields {Name,Age}。
UserInfo uInfo
auto val=STD:get toUType(UserInfoFields:Name)(uInfo);//隐式类型转换
2.3可以进行预声明,以减少某些情况下范围不合格的枚举类型(不能使用预声明):
枚举动物;//错误:ISO C禁止对“enum”类型的正向引用定义了作用域的枚举类型:
枚举类Animal2如果enum中的代码被更改,所有没有限制范围的enum类型的文件都将被重新编译。但是,使用了限定范围的枚举类型,只需要重新编译枚举文件。
只要指定了基础类型,就可以预声明没有限制性函数的枚举类型。
枚举动物:int
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。