首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以确定c++枚举类的元素数量?

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

Stack Overflow用户
提问于 2013-02-21 04:27:11
回答 14查看 75.8K关注 0票数 98

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

代码语言:javascript
运行
复制
enum class Example { A, B, C, D, E };

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

代码语言:javascript
运行
复制
sizeof(Example); // Returns 4 (on my architecture)

有没有一种标准的方法来获得基数(在我的例子中是5)?

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2013-02-21 04:30:37

不是直接使用,但您可以使用以下技巧:

代码语言:javascript
运行
复制
enum class Example { A, B, C, D, E, Count };

那么基数就可以作为static_cast<int>(Example::Count)使用了。

当然,只有让枚举的值从0开始自动赋值,这才能很好地工作。如果不是这样,您可以手动分配正确的基数来计数,这与必须维护单独的常量没有什么不同:

代码语言:javascript
运行
复制
enum class Example { A = 1, B = 2, C = 4, D = 8, E = 16, Count = 5 };

一个缺点是编译器将允许您使用Example::Count作为枚举值的参数--所以在使用它时要小心!(不过,我个人认为这在实践中并不是问题。)

票数 82
EN

Stack Overflow用户

发布于 2019-05-18 20:50:48

对于C++17,您可以从库https://github.com/Neargye/magic_enum中使用magic_enum::enum_count

magic_enum::enum_count<Example>() -> 4.

缺点在哪里?

这个库使用了一个编译器特定的黑客攻击(基于__PRETTY_FUNCTION__ / __FUNCSIG__),它可以在Clang >= 5,MSVC >= 15.3和GCC >= 9上运行。

我们遍历给定的间隔范围,找到所有具有名称的枚举,这将是它们的计数。阅读有关limitations的更多信息

在这篇文章https://taylorconor.com/blog/enum-reflection中有更多关于这个黑客的信息。

票数 34
EN

Stack Overflow用户

发布于 2017-01-28 01:50:34

代码语言:javascript
运行
复制
// clang-format off
constexpr auto TEST_START_LINE = __LINE__;
enum class TEST { // Subtract extra lines from TEST_SIZE if an entry takes more than one 
    ONE = 7
  , TWO = 6
  , THREE = 9
};
constexpr auto TEST_SIZE = __LINE__ - TEST_START_LINE - 3;
// clang-format on

这是从UglyCoder's answer派生的,但在三个方面对其进行了改进。

  • 在type_safe枚举中没有额外的元素(BEGINSIZE) (Cameron's answer也有这个问题。)
    • 编译器不会抱怨在切换语句中缺少这些元素(一个重要问题)
    • 它们不会被无意中传递给需要枚举的函数。(不是通用的problem)

  • 它不需要强制转换即可使用。(Cameron's answer也有这个问题。)
  • 减法不会影响枚举类类型的大小。

Cameron's answer相比,它保留了UglyCoder's的优点,即可以为枚举器分配任意值。

一个问题(与UglyCoder共享,但不与Cameron共享)是它使换行符和注释变得重要……这是出乎意料的。因此,有人可以在不调整TEST_SIZE计算的情况下添加带有空格或注释的条目。这意味着代码格式化程序可能会破坏这一点。在evg656e's注释之后,我编辑了答案以禁用clang-format,但如果您使用不同的格式化程序,则需要注意清空。

票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14989274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档