2013-07-22 16 views
5

yinelemeyi

enum Animal {Cat, Dog, Dolphin} 

gibi ardışık çeteleler yineleme yapmak için birçok yol vardır Ama

enum Animal {Cat = 0, Dog = 5, Dolphin = 8} 
gibi ardışık olmayan numaralandırma öğeleri boyunca yineleme için uygun ve kolay bir yolu vardır aracılığıyla
+0

Doğrudan "enum" üzerinde değil. Ancak "enum" öğesinin tüm öğelerini bir kapsayıcıya ("vektör", "set", "unordered_set", her neyse ...) el ile koyabilirsiniz ve ardından bu kapsayıcıda yineleyin. – syam

+0

Yani demek istediğin bir şey istiyorsun (Animal a = Cat; a! = Dolphin; a ++) '? Bu, ilk numaralandırma için çalışırken, kişisel olarak tavsiye edeceğim bir şey değil, çünkü okumak ve anlamak zor olabilir. –

+2

Bu konudaki cevabı http: // stackoverflow bulabilirsiniz.com/questions/261963/nasıl-i-iterate-over-an-enum. – blitz

cevap

2

Bunun kısa cevabı "hayır".

animals numaralı bir tablo yapabilir ve animals numaralı telefondan bir aralık döngüsü kullanabilirsiniz.

İşte tam "demo" var:

#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; 
} 

çıkışı olacaktır:

0 
5 
8 
0

ben soru bile mantıklı emin değilim. Temelde imkansız olan herhangi bir hızındadır. Düşünün:

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

yatan değer 5 olduğunda, o dog tarafından belirlenen olup olmadığını veya canine tarafından belirleme yolu ve böylece bir sonraki değeri dolphin veya bear olmalıdır olup olmadığını bilmeden yolu yoktur. Değerleri bir diziye ekleyebilir ve bunun üzerine yineleyebilirsiniz, ancak Başka bir çözüm göremiyorum.

Genelde, tabii ki, çoğu zaman bu böyle açıkça etkileyen değerleri konum, bir bit maskesi (std::ios_base::fmtflags gibi mesela ) tanımlarken ve bu durumda, yineleme için hiçbir mantıklı . Aklıma gelen diğer kullanım durumları (yukarıda benim dog/canine örnekte olduğu gibi) özel sentinal ilerlerken muhtemelen atlamak isteyeyim değerleri (örn şey unset gibi), ya da eş olurdu bu durumda, sen' d muhtemelen sadece eş anlamlı birini ziyaret etmek istiyorum ve gerçekçi, şöyle yazma şey olur:

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

ve her zamanki yineleme hileler ne istediğinizi tam neden olacaktır. postfix ++, < ve ihtiyacınız başka bir şey için

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

Ayrıca sayımı için gerekli operatör (ler) sağlayabilir. Tabii ki, onları sayımın tanımıyla senkronize etmelisiniz. Gerçekten basit değil, ama bu bir seçenek.

İlgili konular