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

标签 c++ c++11

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

相关文章:

c++ - 为什么STL中没有std::find_not?

c++ - 给定相同的索引,是否保证 iword() 和 pword() 引用不同的基础值?

c++ - 从两个枚举类创建复合类型,为 STL 映射做好准备

c++ - 关于转换运算符和operator()

c++ - 如何比较成员指针函数与 Microsoft Visual C 中涉及的 DLL 的相等性?

c++ - 纯虚拟析构函数与 protected 构造函数 + 虚拟 dtor

c++ - 我可以在 cblas_gemm(...) 中传递与 "C"和 "A"矩阵相同的矩阵指针吗?

c++ - 将 std::wstring 转换为 const wchar_t x[]

c++ - 右值引用绑定(bind)到 std::function 类型的左值

c++ - 使用 Boost Spirit 解析带有数组的结构