经典的C ++枚举没有简单的方法来检测重复值。
新的C ++ 11中是否解决了此问题enum class
?
enum class ConnectionState : uint32_t
{
Connecting,
Reconnecting = 2,
Disconnecting,
LocalConnection,
NoNetwork = 2,
WifiNetwork,
Last
}
当前无法检测或阻止枚举中多个相同的枚举值。
反射工作组正在研究如何在语言中添加反射(C ++代码自省C ++代码的能力)。在反射所涵盖的一长串内容中,有一个简短的列表正在处理中,并且在那个短列表中,可以检查编译时枚举的值。
在N4428下,检测重复项将很容易。您可以在编译时获得枚举值的数量及其值。只需按顺序创建所有枚举值的包,然后测试它们是否唯一。然后把那个测试的结果扔进去static_assert
。
最终结果可能是:
template<class E>
constexpr bool all_values_unique(); // todo
static_assert( all_values_unique<ConnectionState>(), "Duplicate enum value detected" );
在将类似的反射提议添加到C ++之前,这是不可能的。
您可以使用宏来伪造它-具有一个既创建您的枚举又创建有关它的反射特征信息的宏-然后编写all_values_unique
使用该反射特征信息的宏。这样做的优点是,如果/当标准和/或编译器获得所需的反射功能时,可能很容易剥离宏。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句