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 设备,以便在重新插入后可以防止重新枚举?