经典的C++枚举没有直接的方法来检测重复值.
这个问题是在新的C++ 11中解决的enum class吗?
enum class ConnectionState : uint32_t
{
Connecting,
Reconnecting = 2,
Disconnecting,
LocalConnection,
NoNetwork = 2,
WifiNetwork,
Last
}
Run Code Online (Sandbox Code Playgroud)
目前没有办法检测或防止枚举中的多个相同的枚举值。
反射工作组正在研究如何将反射——C++ 代码内省 C++ 代码的能力——添加到语言中。在反射涵盖的一长串内容中,有一个正在处理的短列表,在该短列表中,在编译时检查枚举的值就在那里。
在 N4428 下,检测重复会很容易。您可以在编译时获取枚举值的数量及其值。只需按顺序创建所有枚举值的包,并测试它们是否唯一。然后将该测试的结果放入static_assert.
最终结果可能是:
template<class E>
constexpr bool all_values_unique(); // todo
static_assert( all_values_unique<ConnectionState>(), "Duplicate enum value detected" );
Run Code Online (Sandbox Code Playgroud)
在将反射提案添加到 C++ 之前,这是不可能的。
你可以使用宏来伪造它——有一个宏来创建你的枚举并创建关于它的反射特征信息——然后all_values_unique使用反射特征信息编写它。这样做的好处是,如果/当标准和/或您的编译器获得所需的反射功能时,很容易剥离您的宏。