有很多方法可以遍历连续的枚举,例如
enum Animal {Cat, Dog, Dolphin}
但是有没有一种方便和简单的方法来遍历不连续的枚举元素,比如
enum Animal {Cat = 0, Dog = 5, Dolphin = 8}
对此的简短回答是“不”。
您可以制作一个表格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
您还可以为枚举提供必要的运算符:
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;
}
++
用于 postfix的DTTO<
以及您需要的任何其他内容。当然,您必须使它们与枚举的定义保持同步。不是很简单,但它是一种选择。
我不确定这个问题是否有意义。无论如何,这在根本上是不可能的。考虑:
enum Animal
{
cat = 0,
dog = 5,
dolphin = 8,
canine = 5,
bear = 20
};
当基础值是5
时,您无法确定它是由dog
还是由设置的canine
,因此无法知道下一个值是否应该是dolphin
或bear
。您可以将值放在一个数组中,然后对其进行迭代,但我没有看到任何其他解决方案。
当然,一般来说,大多数情况下,您都在显式地影响像这样的值,您正在定义一个位掩码(例如 like std::ios_base::fmtflags
),在这种情况下,迭代是没有意义的。我能想到的其他用例是特殊的标记值(例如,类似unset
),在迭代时您可能希望跳过这些值,或者同义词(如上面我的
dog
/canine
示例),在这种情况下,您可能只想访问同义词之一,实际上,您会写如下内容:
enum Animal
{
cat,
dog,
canine = dog,
dolphin,
bear
};
,并且通常的迭代技巧会产生您想要的结果。