传统的 C++ 枚举类型并没有明确的方法来检测重复值。
在新的 C++11 enum class
中是否解决了这个问题?
enum class ConnectionState : uint32_t
{
Connecting,
Reconnecting = 2,
Disconnecting,
LocalConnection,
NoNetwork = 2,
WifiNetwork,
Last
}
传统的 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
,该宏使用反射特性信息。这样做的好处是,如果/当标准和/或编译器获得所需的反射功能时,很容易删除您的宏。