有许多方法可以迭代连续的枚举,例如
enum Animal {Cat, Dog, Dolphin}
但是有一种方便简单的方法可以迭代非连续的枚举元素,比如
enum Animal {Cat = 0, Dog = 5, Dolphin = 8}
答案 0 :(得分:2)
对此的简短回答是“不”。
您可以创建一个表animals
,然后在animals
上使用范围循环。
这是一个完整的“演示”:
#include <iostream>
using namespace std;
enum Animal {Cat = 0, Dog = 5, Dolphin = 8};
int main()
{
Animal animals[] = { Cat, Dog, Dolphin };
for(Animal a : animals) cout << a << endl;
}
输出将是:
0
5
8
答案 1 :(得分:1)
您还可以为枚举提供必要的运算符:
enum Animal
{
Cat = 0
, Dog = 5
, Dolphin = 8
};
inline Animal& operator++ (Animal &x)
{
switch (x) {
case Cat:
x = Dog;
break;
case Dog:
x = Dolphin;
break;
case Dolphin:
default:
x = static_cast<Animal>(static_cast<int>(x) + 1);
break;
}
return x;
}
DTTO for postfix ++
,<
以及您需要的任何其他内容。当然,您必须使它们与枚举的定义保持同步。不是很简单,但它是一种选择。
答案 2 :(得分:0)
我不确定这个问题是否有意义。它在任何地方 从根本上说不可能。考虑:
enum Animal
{
cat = 0,
dog = 5,
dolphin = 8,
canine = 5,
bear = 20
};
当基础值为5
时,您无法确定
它是由dog
还是由canine
设置的,所以没办法
知道下一个值应该是dolphin
还是bear
。
您可以将值放在数组中,然后迭代它,但是
我没有看到任何其他解决方案。
一般来说,当然,大部分时间你都是明确的
影响这样的值,你要定义一个位掩码(例如
像std::ios_base::fmtflags
),在这种情况下,它没有
有意义的迭代。我能想到的其他用例就是
特殊的sentinal值(例如像unset
),你
可能想要在迭代时跳过,或者是同义词(比如我的
上面的dog
/ canine
示例,在这种情况下,您可能会
只想访问其中一个同义词,而且实际上,你是
写点如下:
enum Animal
{
cat,
dog,
canine = dog,
dolphin,
bear
};
,通常的迭代技巧会产生什么 你想要的。