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

亚历山德鲁·伊里米亚(Alexandru Irimiea)

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

新的C ++ 11中是否解决了此问题enum class

enum class ConnectionState : uint32_t
{
    Connecting,
    Reconnecting = 2,
    Disconnecting,
    LocalConnection,
    NoNetwork = 2,
    WifiNetwork,
    Last
}
Yakk-亚当·内夫罗蒙特

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

反射工作组正在研究如何在语言中添加反射(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使用该反射特征信息的宏这样做的优点是,如果/当标准和/或编译器获得所需的反射功能时,可能很容易剥离宏。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章