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

时间:2015-08-19 10:07:15

标签: c++ c++11

经典的C ++枚举没有直接的方法来检测重复值。

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

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

1 个答案:

答案 0 :(得分:4)

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

The reflection working group正在研究如何在语言中添加反射 - C ++代码内省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。这样做的好处是,如果/当标准版和/或编译器获得所需的反射功能时,可能很容易去掉宏。