C++ C++;11包含重复值的枚举类

C++ C++;11包含重复值的枚举类,c++,c++11,C++,C++11,这个问题是否在新的C++11enum类中得到解决 enum class ConnectionState : uint32_t { Connecting, Reconnecting = 2, Disconnecting, LocalConnection, NoNetwork = 2, WifiNetwork, Last } 目前无法检测或防止枚举中存在多个相同的枚举值 正在研究如何添加反射——C++代码对C++代码进行内嵌的能力——语言。在

这个问题是否在新的C++11
enum类中得到解决

enum class ConnectionState : uint32_t
{
    Connecting,
    Reconnecting = 2,
    Disconnecting,
    LocalConnection,
    NoNetwork = 2,
    WifiNetwork,
    Last
}

目前无法检测或防止枚举中存在多个相同的枚举值

正在研究如何添加反射——C++代码对C++代码进行内嵌的能力——语言。在反射涵盖的内容的长列表中,有一个正在处理的短列表,在这个短列表中,在编译时检查枚举的值

包含枚举反射的建议。在外面

在N4428下,检测重复项将很容易。您可以在编译时获取枚举值的数量及其值。只需按顺序创建一个包含所有枚举值的包,并测试它们是否唯一。然后将测试结果放入
静态断言中

最终结果可能是:

template<class E>
constexpr bool all_values_unique(); // todo

static_assert( all_values_unique<ConnectionState>(), "Duplicate enum value detected" );
模板
constexpr bool all_value_unique();//待办事项
静态_断言(所有_值_unique(),“检测到重复的枚举值”);

在把类似的反射建议添加到C++之前,这是不可能的。


您可以使用宏来伪造它——使用一个宏来创建枚举并创建关于它的反射特征信息——然后编写使用反射特征信息的
all_values_unique
。这样做的好处是,如果/当标准和/或您的编译器获得所需的反射功能时,可以很容易地删除宏。

这不是一个问题,而是有意的,而且很有用。@JonathanWakely这里有一个问题:有时,您确实需要一种方法来防止/检测重复。其他时候你不会。缺乏易于检测的方法是一个问题;缺乏防止重复的信息技术不是一个问题,也不是问题的要求。如果/当反思工作组将其工作纳入标准时,这个问题应该得到解决……重复:,这是否回答了您的问题?解决方案是使用Boost预处理器库,或者编写一个开关