有许多方法可以迭代连续的枚举,例如:
但是,是否有一种方便且易于操作的方法可以迭代非连续的枚举元素,例如
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;
}
对于后缀表达式,您可以使用DTTO ++
,<
和其他任何您需要的内容。当然,您必须确保它们与枚举定义保持同步。这并不是非常直接,但这是一个选项。
我不确定这个问题是否有意义。总之,这是根本不可能的。考虑一下:
enum Animal
{
cat = 0,
dog = 5,
dolphin = 8,
canine = 5,
bear = 20
};
当底层值为5
时,您无法确定它是由dog
还是canine
设置的,因此也无法知道下一个值应该是dolphin
还是bear
。您可以将这些值放入数组中,并对其进行迭代,但我没有看到其他解决方案。
通常情况下,当您明确影响像这样的值时,您正在定义位掩码(例如,像std::ios_base::fmtflags
一样),在这种情况下,迭代没有意义。我能想到的其他用例可能是特殊的标记值(例如,类似于unset
的东西),您可能希望在迭代时跳过它们,或者是同义词(如上面我的dog
/canine
示例),在这种情况下,您可能只想访问其中一个同义词,实际上,您会编写类似于以下内容的代码:
enum Animal
{
cat,
dog,
canine = dog,
dolphin,
bear
};
和通常的迭代技巧一样,会得到你想要的结果。
vector
、set
、unordered_set
等),然后迭代该容器。 - syamfor (Animal a = Cat; a != Dolphin; a++)
这样的东西吗?虽然这对于第一个枚举值来说是可行的,但我个人不建议这样做,因为它可能很难阅读和理解。 - Some programmer dude