问题标签 [enum-class]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2725 浏览

c++ - 强类型 C++0x 枚举比较

为什么强类型 C++0x 枚举的实例不能相互比较?


更新:它们在 gcc 4.6 中具有可比性;我不确定它是否适用于 gcc 4.4。

0 投票
3 回答
757 浏览

c++ - 我可以使用枚举类值作为可变参数函数的参数吗?

C++11 增加了枚举类,它们是强类型枚举——枚举类的值不会隐式转换为其他枚举类或整数的值,并且通过显式大小说明符允许前向声明。

是否可以将此类枚举的值传递给可变参数函数并保持标准定义的行为?在实现定义的行为中?

0 投票
3 回答
4042 浏览

c++ - 验证整数是一些枚举类项 (C++11)

我有一些枚举类

我想检查是否可以将某个整数转换为Foo. 这样做的理想方法是什么?这是用于运行时检查(在编译时整数未知)

显然,我可以通过艰难的方式做到这一点(编写一个bool CheckEnum(Foo);带有大开关的函数,对于除默认情况外的所有情况都返回 true),但我希望有一种更优雅的机制来避免这么多的编写。MPL 或Boost.Preprocessor将是一个完全可以接受的解决方案,但遗憾的是我对其中一个知之甚少

0 投票
2 回答
701 浏览

c++ - 枚举和枚举类的链接兼容性

假设有一个使用枚举类的 C++11 API:

现在假设我想使用这个 API,但我没有 C++11 编译器。所以我:

  • 修改api.hpp枚举类并将其更改为常规枚举。
  • 编写一些包含修改后的代码代码api.hpp并正常使用API​​(例如调用f)。
  • 使用我的非 C++11 编译器编译此代码,并将其链接到使用 C++11 编译器编译的 API 实现(使用未修改的api.hpp)。

这似乎适用于 GCC,但总的来说它是安全的,还是我在玩火(违反 ODR 等)?

假设这两个编译器在其他方面是链接兼容的,那么只有 enum 与 enum 类有问题。

0 投票
6 回答
12051 浏览

c++ - std::get 使用枚举类作为模板参数

我使用std::tuple并定义了一个类枚举以某种方式“命名”元组的每个字段,忘记了它们的实际索引。

所以不要这样做:

我这样做了:

问题是,由于使用 gcc 4.5.2 编译,我现在安装了 4.6.1 版本,我的项目无法编译。此代码段重现了错误:

该错误基本上表明没有与我的调用相匹配的重载std::get

那么,有什么方法可以将我的枚举类用作模板参数std::get?这是不是要编译的东西,而是在 gcc 4.6 中修复的?我可以使用一个简单的枚举,但我喜欢枚举类的作用域属性,所以如果可能的话,我更喜欢使用后者。

0 投票
8 回答
136685 浏览

c++ - 如何在 C++11 中输出枚举类的值

如何enum class在 C++11 中输出 an 的值?在 C++03 中是这样的:

在 c++0x 中,此代码无法编译

Ideone.com编译

0 投票
1 回答
247 浏览

c++ - 自记录代码是否值得潜在的性能问题?

我创建了一个小类,它允许我使用强类型枚举的枚举器作为标志(组合)。我正在使用 type_traits 进行底层类型检测,因此它也应该是稍微类型安全的,并且主要在编译时处理。但是,我想知道这是否真的值得。

我现在可以写类似的东西

并且程序员将看到他只能使用 Mode 中的枚举器(例如 Mode::Read),而且他不能将任何其他枚举与 Mode 结合使用。你认为这是更好的方法吗?

,我不确定人们是否会欣赏它?

0 投票
5 回答
26652 浏览

c++ - 使用枚举类的 C++11 标准符合位掩码

您可以使用枚举类实现标准符合(如 n3242 草案的 17.5.2.1.3 中所述)类型的安全位掩码吗?我读它的方式,如果类型 T 支持 |,&,^,~,|=,&= 和 ^= 运算符,则它是位掩码,并且您可以进一步执行 if(l&r) 其中 l 和 r 属于 T 类型. 列表中缺少运算符 != 和 == 并允许排序一个可能还想重载 <。

让操作员工作只是烦人的样板代码,但我不知道如何做 if(l&r)。至少以下内容不能使用 GCC 编译(除了非常危险,因为它允许错误的隐式转换为 int):

编辑:我现在确定枚举类不能有成员。但是,如何做 if(l&r) 的实际问题仍然存在。

0 投票
1 回答
155 浏览

c++ - 声明枚举标识符的基础类型

我已经声明了一个枚举如下:

当我尝试将 directoryType 类型附加到字符串时,这会导致错误。我相信我需要在枚举声明中包含枚举标识符的基础类型。或者类似的东西

http://msdn.microsoft.com/en-us/library/2dzy4k6e(v=vs.80).aspx中所述

但是,这不是为我编译的。声明枚举标识符的基础类型的正确语法是什么?

0 投票
3 回答
18247 浏览

c++ - 是否可以手动定义枚举类的转换?

通常,您可以使用以下语法为类定义强制转换:

有没有办法做到这一点或类似的事情enum class