问题标签 [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 投票
14 回答
80097 浏览

c++ - 是否可以确定 c++ 枚举类的元素数量?

是否可以确定 c++ 的基数enum class

我尝试使用sizeof,但是,它返回枚举元素的大小。

有没有获得基数的标准方法(在我的示例中为 5)?

0 投票
4 回答
15934 浏览

c++ - 枚举类可以嵌套吗?

这可以做到吗?

如果没有,是否有替代解决方案?

这个问题的目的:想要/需要能够做这样的事情:

希望使用强类型功能。

0 投票
1 回答
1316 浏览

c++ - C++11 中的静态导入(例如枚举类)

我对枚举类(VS2012)的使用:

在我使用的另一个片段中

如果名称很长,这会变得非常混乱。

是否可以以某种方式导入枚举值以便我可以编写:

嵌套类也一样——我可以导入它们吗?

0 投票
3 回答
84396 浏览

c++ - 枚举类运算符的实现

在讨论了“枚举类”的递增和递减</a>之后,我想问一下enum class类型的算术运算符的可能实现。

原始问题的示例:

有没有办法实现算术运算符而不强制转换为已定义运算符的类型?我想不出来,但选角让我很困扰。演员表通常表明有问题,并且必须有一个很好的理由来使用它们。我希望该语言允许在不强制使用特定类型的情况下实现运算符的实现。

2018 年 12 月更新:一篇关于 C++17 的论文似乎通过允许枚举类变量和基础类型之间的转换至少部分解决了这个问题:http ://www.open-std.org/jtc1/sc22/wg21/文档/论文/2016/p0138r2.pdf

0 投票
0 回答
338 浏览

c++ - c++11:通过别名模板对枚举类类型导数进行类型转换

考虑以下代码,它在 clang 中编译得很好,但在 gcc (4.7.2) 中编译得不好:

代码在 clang 中编译得很好,但在 gcc (4.7.2) 中,最终语句导致:

有问题的陈述与前3个陈述之间的区别是:

  1. 它涉及枚举类类型,而不是非枚举类类型。
  2. 它使用一个别名模板,它声明typename::type为方便起见

我的问题:以这种方式使用typename(在“别名模板”中)是否符合 C++11 标准,即使typename在不需要说明符的上下文中使用?或者这是 gcc 中的“语言不合规错误”?

0 投票
1 回答
2342 浏览

c++ - 枚举和枚举类的区别?

我最近开始使用 C++/CLI 托管代码,但我总是这样定义枚举:

直到今天,当我遇到错误消息时:

正如消息和各种堆栈溢出问题中所建议的那样,将我的代码更改为:

很快解决了这个问题。

但是,我仍然不知道我现在知道定义枚举的两种不同方式之间的差异。有人可以帮我澄清一下吗?还有什么让“枚举类”更适合托管代码?

提前致谢,

盖伊

0 投票
2 回答
198 浏览

c++ - 编译时的枚举数序列

给定一个 C++11 枚举类,是否有一些模板或其他构造在编译时迭代所有枚举器的集合?是否可以定义一个模板来例如用该枚举类型的所有可能值初始化一个数组?

0 投票
1 回答
6522 浏览

c++ - 使用带有 std::bitset 的枚举类

首先,我想要一个普通的枚举而不是基于位的枚举,因为不同枚举的数量将超出任何整数类型。我还想利用 C++11 的类型安全性enum class。为此,自然的选择是std::bitset,但是我不知道如何将这两者绑定在一起。

需要定制bitset吗?如何绕过这样一个类的实现?

0 投票
2 回答
4334 浏览

c++ - 通过引用或值枚举 C++11 类

我基本上有两个问题可能是相关的,所以我将它们合二为一。

在传递给函数时,我们应该通过引用还是值来传递 C++11 中的枚举类。它是一种继承原始类型,但它是传递的整个对象吗?因为枚举类是类型安全的;

现在假设我们有函数 sig

我的另一个问题在这里-

0 投票
3 回答
38397 浏览

c++ - 用户定义的 C++11 枚举类默认构造函数

有没有办法指定一个的默认构造函数enum class

我正在使用enum class指定一组允许库中特定数据类型的值:在这种情况下,它是 Raspberry Pi 的 GPIO 引脚 ID 号。它看起来像这样:

enum class PinID : int {N4 = 4, N17 = 17, /* ...etc... */ }

我这样做而不是仅仅使用 an 的int目的是确保代码是安全的:我可以static_assert(或者编译时确保 - 使用的实际方法对我来说并不重要)像某人没有的事情出现拼写错误(传递 5 而不是 4 等),并且我收到类型不匹配等的自动错误消息。

那么问题是它enum class有一个默认构造函数——为了与 C 的兼容性,enum我假设(因为它们具有相同的行为)——初始化enum class0. 在这种情况下,没有任何0价值。这意味着用户做出如下声明/定义:

PinID pid = PinID();

正在获取一个未明确定义的枚举器(当人们查看代码时,它甚至似乎都不“存在”),并且可能导致运行时错误。这也意味着switch在没有错误/默认情况的情况下,像对显式定义的枚举器的值进行 ing 这样的技术是不可能的——我想避免这种情况,因为它迫使我要么要么throw做类似 return a 的事情boost::optional,而这些事情不太适合静态分析。

我试图定义一个默认构造函数无济于事。我(拼命地)试图定义一个共享名称的函数enum class,但这(毫不奇怪)导致了奇怪的编译器错误。我想保留转换 to 的能力enum classint所有N#枚举器都映射到它们各自的#,所以仅仅“定义”,比如 N4 = 0 是不可接受的;这是为了简单和理智。

我想我的问题有两个:有没有办法获得我使用后的那种静态安全enum class?如果不是,人们更喜欢哪些其他可能性?我想要的是:

  1. 是默认可构造的
  2. 可以将默认构造设置为任意有效值
  3. 提供由enum classes提供的“指定的有限集”值
  4. 至少与enum class
  5. (最好)不涉及运行时多态性

我想要默认可构造性的原因是因为我计划使用它boost::lexical_cast来减少值之间转换所涉及的语法开销,以及我输出到操作系统enum class的实际关联s(在本例中为 sysfs);需要默认的可构造性。stringboost::lexical_cast

我的推理中的错误是受欢迎的——我开始怀疑enum classes 是错误工作的正确对象,在这种情况下;如果被问到,将提供澄清。感谢您的时间。