包含重复值的C++ 11 Enum类

Ale*_*iea 7 c++ c++11

经典的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)

Yak*_*ont 5

目前没有办法检测或防止枚举中的多个相同的枚举值。

反射工作组正在研究如何将反射——C++ 代码内省 C++ 代码的能力——添加到语言中。在反射涵盖的一长串内容中,有一个正在处理的短列表,在该短列表中,在编译时检查枚举的值就在那里。

N4428包含一个枚举反射的提议。 有一些部分实现

在 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使用反射特征信息编写它。这样做的好处是,如果/当标准和/或您的编译器获得所需的反射功能时,很容易剥离您的宏。