是否可以编写一个匿名枚举类,然后比较它包含的内容?例如。
enum class { APPLE, BANANA } fruitType;
// ...
if (fruitType == fruitType::APPLE)
// ...
不,
fruitType
是一个变量(尽管输入了名称)。您不能使用变量名称来访问有关其类型的内容。
enum class
的想法是,这些值在定义之外不可见,除非您在它们前面加上类型名称前缀。如果类型没有名称,这将很困难!
我想说这没有道理。它打破了枚举类的整体思想,引入枚举类是为了解决传统枚举的一些问题(将枚举数导出到周围范围、隐式转换为 int、无法指定底层类型)。如果声明匿名枚举类,则无法访问其枚举器,因为它们无法被限定。所以这没有任何意义。
你不能这样做:
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)
你不能。
但我同意能够做到这一点就很好了。有时,枚举已经是充分嵌套且有限范围的一部分,进一步的限定纯粹是矫枉过正,但您仍然希望禁止转换为 int。所以你必须做出权衡:选择两个功能或都不选择。
不是这样。
fruitType::APPLE
不正确,因为 fruitType
不是命名空间的名称。但是,如果您只是写 fruitType == APPLE
(不加前缀 APPLE
),那就没问题了。
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 技巧。