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

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

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

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

【问题讨论】:

  • 是的,但只是 C++11 语言的一部分(不是库解决方案)。

标签: c++ enums


【解决方案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 类型的变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-14
相关资源
最近更新 更多