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

12

传统的 C++ 枚举类型并没有明确的方法来检测重复值。

在新的 C++11 enum class 中是否解决了这个问题?

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

5
没问题,这是故意的,并且很有用。 - Jonathan Wakely
6
这里存在一个问题:有时候,你确实需要一种方法来防止/检测重复。而有时候则不需要。缺乏一种方便的检测方法是一个问题;它不能防止重复,这也不是问题,也不是这个问题所要求的。如果/当反射工作组将他们的工作写入标准中时,这个问题应该得到解决... - Yakk - Adam Nevraumont
C/C++ 枚举:检测多个项映射到相同值时的方法确保 C++ 枚举值在编译时唯一 - phuclv
这回答解决了你的问题吗?C / C ++枚举:检测多个项映射到相同值时 - phuclv
解决方案是使用 Boost 预处理器库,或编写一个 switch。 - phuclv
1个回答

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" );

在像反射提案被添加到C++之前,这是不可能的。

您可以使用宏来模拟它--创建一个既创建枚举又创建有关其反射特性信息的宏--然后编写all_values_unique,该宏使用反射特性信息。这样做的好处是,如果/当标准和/或编译器获得所需的反射功能时,很容易删除您的宏。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接