有很多种方法,通过连续的枚举迭代像迭代通过在C++中不连续的枚举元素
enum Animal {Cat, Dog, Dolphin}
但有通过非连续的枚举元素进行迭代像
enum Animal {Cat = 0, Dog = 5, Dolphin = 8}
方便和简单的方法
有很多种方法,通过连续的枚举迭代像迭代通过在C++中不连续的枚举元素
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,
canine = 5,
bear = 20
};
当基础值为5
,你没有办法确定 是否由dog
设置或canine
的,所以没办法的 知道下一个值是否应该dolphin
或bear
。 你可以把值放在一个数组中,并迭代它,但是我没有看到任何其他解决方案。
一般情况下,当然,大部分的时间你明确 影响值这样这样,你定义一个位掩码(如 像std::ios_base::fmtflags
),并且在这种情况下,它是没有意义 迭代。我能想到的其他用例是 特殊的主要值(例如unset
之类的东西),其中 在迭代时可能会想要跳过,或者是同义词(如上面的示例中的我的 dog
/canine
),在这种情况下, ð大概 只想参观同义词之一,抓实,你 写一样的东西:
enum Animal
{
cat,
dog,
canine = dog,
dolphin,
bear
};
,和平常迭代技巧会导致你想要什么 。
你也可以为枚举了必要的运营商(S):
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'上。然而,你可以手动将'enum'的所有元素放在一个容器中('vector','set','unordered_set',无论什么......),然后迭代该容器。 – syam
你的意思是你想要像for(Animal a = Cat; a!= Dolphin; a ++)'?虽然这适用于第一次枚举,但这不是我个人推荐的,因为它可能很难阅读和理解。 –
你可以在这个线程http:// stackoverflow找到答案。com/questions/261963/how-can-i-iterate-over-an-enum。 – blitz