C++ 中有没有办法定义一个枚举,以便在访问时它的值必须是完全限定的?

Posted

技术标签:

【中文标题】C++ 中有没有办法定义一个枚举,以便在访问时它的值必须是完全限定的?【英文标题】:Is there a way in C++ to define an enum such that its values must be fully qualified when accessed? 【发布时间】:2014-05-02 22:05:48 【问题描述】:

关于 C++ 枚举,最困扰我的一件事是枚举值可以在没有任何上下文的情况下访问,从而让读者知道正在访问哪种类型。换句话说,如果我有:

typedef enum Color NONE, RED, GREEN, ... ;

例如,我可以将变量与“NONE”进行比较,而无需编写“Color::NONE”。有没有办法以要求值完全限定的方式定义枚举类型?例如,这就是 C# 所做的。

【问题讨论】:

是的,但只是 C++11 语言的一部分(不是库解决方案)。 【参考方案1】:

您可以使用新的enum class,但语义不同。它也是严格意义上的 C++ 11/14 的一部分。

enum class type t1, t2, t3 ;

【讨论】:

我将不得不支持这个答案。这就是我使用的。 “语义不一样”是什么意思?定义它们有点不同,但使用它们似乎正是我想要的。谢谢! 您不能将它们与整数互换使用,因为它们不再被隐式转换。因此,它不向后兼容。此外,由于 enum class 与不同的 enum class 在类型方面不同,它可以做你可能没想到的事情。【参考方案2】:

将您的枚举放在一个命名空间中,并使用您想要限定它们的名称。

namespace Color
  typedef enum thisNameDoesntMatter NONE, RED, GREEN, ...;

【讨论】:

我考虑过这个,这似乎有点小技巧,但结果对我来说似乎值得。所以,谢谢! 另外,您可以将 parse()、toString()、getAll() 等函数放在同一个命名空间中。 @vargonian:我想说你所做的任何事情都会“有点技巧”,因为语言允许我输入NONE(这是典型的做法) . IMO 我不会做这样的事情。我们这些了解 C++ 的人会觉得它很奇怪。 这样做的主要问题是您不能拥有Color 类型的变量。

以上是关于C++ 中有没有办法定义一个枚举,以便在访问时它的值必须是完全限定的?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法保存 USB 设备,以便在重新插入后可以防止重新枚举?

重新链接符号,以便“跳转到定义”在 Xcode 4.6 中有效

将 C++ 枚举导入 C#

java 枚举

有没有办法用 2 的幂(或计算值)定义一个快速枚举

有没有办法在 Android.bp 文件中定义 C 语言宏?