经典的C ++枚举没有直接的方法来检测重复值。
这个问题是在新的C ++ 11中解决的吗enum class
?
enum class ConnectionState : uint32_t
{
Connecting,
Reconnecting = 2,
Disconnecting,
LocalConnection,
NoNetwork = 2,
WifiNetwork,
Last
}
答案 0 :(得分:4)
目前无法在枚举中检测或阻止多个相同的枚举值。
The reflection working group正在研究如何在语言中添加反射 - C ++代码内省C ++代码的能力。在反射所涵盖的长列表中,有一个简短的列表,在那个简短的列表中,在编译时检查枚举的值是存在的。
N4428包含枚举反射的提案。 There are some partial implementations那里。
在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
。这样做的好处是,如果/当标准版和/或编译器获得所需的反射功能时,可能很容易去掉宏。