我没有看到任何比 OP 提供的解决方案从根本上更好的解决方案。但是,它有一个小缺陷,我可以建议一个(非标准)解决方法。
问题如下。假设今天的代码与 OP 中的代码一样,但是有一天,有人添加了一个新的枚举器,EnumClass
它变为:
enum class EnumClass { A, B = 4, C = 9, D = 60, E = 70 };
还假设此人忘记更新 的定义checkEnumClass
(这不太可能发生,特别是如果代码在另一个文件中)。然后,
checkEnumClass( 70 );
false
尽管 70 现在是一个有效值,但仍会返回。单元测试可能有助于捕获此错误,但此人必须记住更新测试。(回想一下,他们一开始就忘记更新代码了!)
不幸的是,标准 C++ 没有提供强制 a 覆盖所有情况的方法switch
(enum
与提供final switch
语句的 D 不同)。
但是,有一些特定于编译器的功能可以为您做到这一点。
对于 GCC(我相信还有 Clang),您可以添加编译器选项-Wswitch
(或者-Wall
这意味着-Wswitch
)。对于 Visual Studio,您可以添加
#pragma warning(error : 4062)
到包含的文件checkEnumClass
(不是包含枚举定义的文件)
最后,您必须稍作更改checkEnumClass
,因为default
标签告诉编译器所有情况都已涵盖。代码应该是这样的:
bool checkEnumClass( int v )
{
switch( static_cast< EnumClass >( v ) )
{
case EnumClass::A:
case EnumClass::B:
case EnumClass::C:
case EnumClass::D:
return true;
}
return false;
}
使用此解决方法,包含枚举E
器但忘记相应更新的人checkEnumClass
将收到以下错误/警告:
海合会:
警告:枚举值“E”未在开关 [-Wswitch] 中处理
视觉工作室:
错误 C4062:枚举 'EnumClass' 的开关中的枚举器 'E' 未处理
switch( static_cast< EnumClass >( v ) )
更新 1:根据elvis.dukaj的评论。
作为一种好的做法,添加-Werror
GCC 的选项以将所有警告转换为错误。
更新 2:即使有-Wswitch
标签也会-Wswitch-enum
引发警告(或错误 if )。不幸的是,我不知道 Visual Studio 中有任何类似的功能。-Werror
default