经典的 C++ 枚举没有直接的方法来检测重复值。
新的 C++11 enum class
是否解决了这个问题?
enum class ConnectionState : uint32_t
{
Connecting,
Reconnecting = 2,
Disconnecting,
LocalConnection,
NoNetwork = 2,
WifiNetwork,
Last
}
最佳答案
目前没有办法检测或防止枚举中有多个相同的枚举值。
The reflection working group正在研究如何向语言添加反射——C++ 代码自省(introspection) 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
。这样做的好处是,如果/当标准和/或您的编译器获得所需的反射功能时,可能很容易去除您的宏。
关于C++11 枚举类包含重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32092484/