匿名枚举类

问题描述 投票:0回答:7

是否可以编写一个匿名枚举类,然后比较它包含的内容?例如。

enum class { APPLE, BANANA } fruitType;
// ...
if (fruitType == fruitType::APPLE)
    // ...
c++ enums c++11
7个回答
10
投票

不,

fruitType
是一个变量(尽管输入了名称)。您不能使用变量名称来访问有关其类型的内容。

enum class
的想法是,这些值在定义之外不可见,除非您在它们前面加上类型名称前缀。如果类型没有名称,这将很困难!


1
投票

我想说这没有道理。它打破了枚举类的整体思想,引入枚举类是为了解决传统枚举的一些问题(将枚举数导出到周围范围、隐式转换为 int、无法指定底层类型)。如果声明匿名枚举类,则无法访问其枚举器,因为它们无法被限定。所以这没有任何意义。


1
投票

你不能这样做:

enum class { APPLE, BANANA } fruitType;
if (fruitType == fruitType::APPLE)

但是你可以这样做:

enum class FT { APPLE, BANANA } fruitType;
if (fruitType == FT::APPLE)

...这可能同样简单。


注意,您可能想要初始化它:

enum class FT { APPLE, BANANA } fruitType = FT::BANANA;
if (fruitType == FT::APPLE)

1
投票

你不能。

但我同意能够做到这一点就很好了。有时,枚举已经是充分嵌套且有限范围的一部分,进一步的限定纯粹是矫枉过正,但您仍然希望禁止转换为 int。所以你必须做出权衡:选择两个功能或都不选择。


1
投票

不是这样。

fruitType::APPLE
不正确,因为
fruitType
不是命名空间的名称。但是,如果您只是写
fruitType == APPLE
(不加前缀
APPLE
),那就没问题了。


0
投票

是的,这是可能。但如果它是匿名的,那么它就无法在其任何范围之外访问。

编辑:你问题的第二部分是一个错误。你不必提及

fruitType::
。然而,即使删除它之后;编译失败。这说明它不可用。

所以我不确定你的第二个问题。我很久以前就问过类似的问题。


0
投票
代替

fruitType::BANANA

,您实际上可以使用 
decltype(fruitType)::BANANA
,它将实现使枚举类类型可从其变量访问的技巧。所以,理论上,你可以使用:

enum class { APPLE, BANANA } fruitType; // ... fruitType = decltype(fruitType)::BANANA; // ... if (fruitType == decltype(fruitType)::APPLE) { std::cout << "won't reach here!" << std::endl; }
但是,C++ 标准明确禁止匿名枚举类,但支持匿名枚举。因此,第一行会给您一个错误,例如“不允许未命名的作用域枚举”。如果您在 

enum class

 后面插入任何虚拟名称,即使该虚拟名称不再使用,它也会起作用。

许多人不鼓励使用

decltype(var)

。但请注意,C++14 向 lambda 引入了 
auto
 参数,而 C++20 也在普通函数中引入了 
auto
 参数。对于这两者,
decltype()
是访问用于给定参数的编译时类型的唯一方法,因此
decltype()
最近在普通代码中变得越来越常见。它绝对不再局限于复杂的模板类定义和 SFINAE 技巧。

© www.soinside.com 2019 - 2024. All rights reserved.