是否可以确定c++ enum class
的基数
enum class Example { A, B, C, D, E };
我尝试使用sizeof
,但是,它返回枚举元素的大小。
sizeof(Example); // Returns 4 (on my architecture)
有没有一种标准的方法来获得基数(在我的例子中是5)?
发布于 2013-02-21 04:30:37
不是直接使用,但您可以使用以下技巧:
enum class Example { A, B, C, D, E, Count };
那么基数就可以作为static_cast<int>(Example::Count)
使用了。
当然,只有让枚举的值从0开始自动赋值,这才能很好地工作。如果不是这样,您可以手动分配正确的基数来计数,这与必须维护单独的常量没有什么不同:
enum class Example { A = 1, B = 2, C = 4, D = 8, E = 16, Count = 5 };
一个缺点是编译器将允许您使用Example::Count
作为枚举值的参数--所以在使用它时要小心!(不过,我个人认为这在实践中并不是问题。)
发布于 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中有更多关于这个黑客的信息。
发布于 2017-01-28 01:50:34
// 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派生的,但在三个方面对其进行了改进。
BEGIN
和SIZE
) (Cameron's answer也有这个问题。)与Cameron's answer相比,它保留了UglyCoder's的优点,即可以为枚举器分配任意值。
一个问题(与UglyCoder共享,但不与Cameron共享)是它使换行符和注释变得重要……这是出乎意料的。因此,有人可以在不调整TEST_SIZE
计算的情况下添加带有空格或注释的条目。这意味着代码格式化程序可能会破坏这一点。在evg656e's注释之后,我编辑了答案以禁用clang-format
,但如果您使用不同的格式化程序,则需要注意清空。
https://stackoverflow.com/questions/14989274
复制相似问题