2013-07-22 35 views
5

有很多种方法,通过连续的枚举迭代像迭代通过在C++中不连续的枚举元素

enum Animal {Cat, Dog, Dolphin} 

但有通过非连续的枚举元素进行迭代像

enum Animal {Cat = 0, Dog = 5, Dolphin = 8} 
方便和简单的方法
+0

不直接在'enum'上。然而,你可以手动将'enum'的所有​​元素放在一个容器中('vector','set','unordered_set',无论什么......),然后迭代该容器。 – syam

+0

你的意思是你想要像for(Animal a = Cat; a!= Dolphin; a ++)'?虽然这适用于第一次枚举,但这不是我个人推荐的,因为它可能很难阅读和理解。 –

+2

你可以在这个线程http:// stackoverflow找到答案。com/questions/261963/how-can-i-iterate-over-an-enum。 – blitz

回答

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 
0

我不知道,这个问题甚至是有道理的。它在任何 率基本不可能。试想一下:

enum Animal 
{ 
    cat = 0, 
    dog = 5, 
    dolphin = 8, 
    canine = 5, 
    bear = 20 
}; 

当基础值为5,你没有办法确定 是否由dog设置或canine的,所以没办法的 知道下一个值是否应该dolphinbear。 你可以把值放在一个数组中,并迭代它,但是我没有看到任何其他解决方案。

一般情况下,当然,大部分的时间你明确 影响值这样这样,你定义一个位掩码(如 像std::ios_base::fmtflags),并且在这种情况下,它是没有意义 迭代。我能想到的其他用例是 特殊的主要值(例如unset之类的东西),其中 在迭代时可能会想要跳过,或者是同义词(如上面的示例中的我的 dog/canine),在这种情况下, ð大概 只想参观同义词之一,抓实,你 写一样的东西:

enum Animal 
{ 
    cat, 
    dog, 
    canine = dog, 
    dolphin, 
    bear 
}; 

,和平常迭代技巧会导致你想要什么 。

1

你也可以为枚举了必要的运营商(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为后缀++<和其他任何你需要的。当然,你必须让它们与枚举的定义保持同步。不太直截了当,但它是一种选择。