如何按标准迭代枚举
How to iterate over enums, by standard?
我在谷歌上搜索如何迭代枚举,我发现了各种各样的建议,比如如何迭代枚举?虽然可以,所有这些方法都必须回到迭代整数,但我发现建议的解决方案或多或少是一种黑客攻击。为什么不能更好地支持此操作,是否有更深层次的原因?还是从另一边看,哪一个更便携(包括C和C++之间的一个)和更标准?
要遍历在 C 和 C++ 之间可移植的通用枚举,只需使用查找表:
typedef enum
{
hello = 123,
world = 456
} hello_t;
const hello_t TABLE [ENUM_ITEMS] =
{
hello,
world
};
for(size_t i=0; i<ENUM_ITEMS; i++)
{
printf("%d", (int)TABLE[i]);
}
不幸的是,没有办法以编程方式获取常量ENUM_ITEMS
,除非你有一个没有分配值的非特定枚举,如enum { hello, world, ENUM_ITEMS }
。如果某些枚举常量是显式分配的数字,那么您只能做这样的事情:
typedef enum
{
ENUM_START = __LINE__,
hello = 123,
world = 456,
ENUM_ITEMS = __LINE__ - ENUM_START - 1
} hello_t;
C 还是 C++ ?这不是一回事。
你不能在 C 中迭代枚举,因为枚举只是在编译时被那里的编号切换。但是,如果您确定枚举中的内容,则可以"迭代",如下所示:
enum color {
YELLOW,
GREEN,
BLUE,
RED,
/* Please, add new color BEFORE this comment */
NB_COLOR
};
for (int i = 0; i < NB_COLOR; ++i) {
/* Do something */
}
但正如你所说,这更像是一个黑客,因为你无法确定你的枚举是否以 0 开头,也无法确定 C 中的枚举之间没有"空槽"。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 不带大括号的枚举形式
- C++中带有List类的迭代器Segfault
- 迭代时从向量和内存中删除对象
- 枚举环境变量的惯用C++14/C++17方法
- 如何在c++迭代器类型中包装std::chrono
- 带过滤器的现代迭代c++集合
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 元编程构造,它返回枚举的基础类型和迭代器的整数
- C++:使用枚举类型进行迭代
- 如何在类似java的c++中迭代器枚举
- 如何按标准迭代枚举
- 你能使用 Qt foreach 循环迭代每个可能的枚举值吗?
- 在c++中迭代连续枚举值的最简单方法
- 用于枚举图中所有节点值的假迭代器操作
- 迭代Vs.枚举
- 迭代方向枚举
- 不带循环迭代器的枚举
- 如何迭代枚举