2013-07-22 23 views
5

反復++

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により決定する手立て、およびので、次の値がdolphinまたはbearあるべきかどうかを知ること の方法がありません。 値を配列に入れて繰り返し処理できますが、 他の解決策はありません。

一般的には、もちろん、あなたが明示的にこのこのような 影響を与える値だほとんどの時間は、あなたはビットマスク(std::ios_base::fmtflagsのような例 )を定義している、その場合には、それが反復するために何 意味がありません。私は考えることができる他のユースケースは、(上記の私の dog/canine例のような) 特別なセンチネル繰り返し処理を行う場合、あなたはおそらく、スキップしたい 値(例えば、何かunsetなど)、またはシノニム、となり、その場合、あなたの」 Dはおそらく は同義語のいずれかを訪問したい、と現実的に、次のような 書き込み何かしたい:

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

を、通常の反復のトリックは、正確に何をしたい ことになります。 postfixの++<とあなたが必要とする何か他のもののために

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:

1

はまた、列挙するために必要なオペレータ(複数可)を提供することができます。もちろん、それらを列挙の定義と同期させておく必要があります。それほど単純ではありませんが、オプションです。