2014-11-05 28 views
7

ben int işaretsiz türüne sahip bir kapsamlı-enum açmak için çalışıyorum Açılması: olarakkapsamlı enum

enum tanımlanır bu değeri enum değerlerine göre kontrol etmeye çalışmak.

void func(const unsigned int & num) 
{ 
    switch (num) 
    { 
    case EnumType::SOME: 
     .... 
     break; 
    case EnumType::MORE: 
     .... 
     break; 

    .... 

    default: 
     .... 
    } 
} 

Bu sözdizimi hatası ile sonuçlanır: gibi, her anahtarın üzerinde bir static_cast kullanarak, Şimdi Error: This constant expression has type "EnumType" instead of the required "unsigned int" type.

:

case static_cast<unsigned int>(EnumType::SOME): 
    .... 
    break; 
case static_cast<unsigned int>(EnumType::MORE): 
    .... 
    break; 

düzeltmeleri sözdizimi hatası her case ifadesi doesn de döküm rağmen Bunu yapmanın iyi bir yolu gibi görünmüyor. Her durumda gerçekten almam gerek mi yoksa daha iyi bir yolu var mı?

+0

Kanaatimce, güçlü bir şekilde yazılan enumların tümü, ... ... iyi yazılmışlar, bu yüzden örtük bir dönüşüm yok. Yani evet, yayınlaman gerek. DÜZENLEME: Şimdi görmen gerekmediğini, her bir durum için yayınlayıp yayınlamayacağınızı sormadığını görüyorum. Üzgünüm benim hatam. – antred

cevap

10

Sen EnumType geçiş değişkeni kendisi atayarak bu çözebilir: kapsamlı çeteleler

switch (static_cast<EnumType>(num)) { 

(Demo)

amaç onları kesinlikle yazılan yapmaktır. Bu amaçla, altta yatan türden veya bunlara ilişkin gizli dönüşümler yoktur. Anahtar değişkenini veya anahtar kutularını dönüştürmelisiniz. Bu, daha az kod gerektiren ve bu nedenle bakım işlemini kolaylaştıracağı için anahtar değişkenini dönüştürmenizi öneririm.

IMO'nun doğru çözümü, işlevi const EnumType & (veya yalnızca EnumType) kabul etmek üzere değiştirmek olacaktır.