2011-06-08 23 views
42

Olası Çoğalt:
Is there a simple script to convert C++ enum to string?Enum String C++

yüzden sık Hep yapıyor sonunda c bir dize ++

bir enum dönüştürmek gerekir bulmak:

enum Enum{ Banana, Orange, Apple } ; 

char * getTextForEnum(int enumVal) 
{ 
    switch(enumVal) 
    { 
    case Enum::Banana: 
    return "bananas & monkeys"; 
    case Enum::Orange: 
    return "Round and orange"; 
    case Enum::Apple: 
    return "APPLE" ; 

    default: 
    return "Not recognized.."; 
    } 
} 

Bunu yapmak için daha iyi veya tanınmış bir deyim var mı?

+0

Belki std :: map 'yerine enum ve anahtarı' kullanmak ? Bir nesneye bir parça sarılarak, tüm uygulamalarınız için bir hata kodu araması ve işleyicisi olarak yeniden kullanılabilmenizi sağlayacak kadar akıllı olabilirsiniz. – AJG85

+3

Bir iyileştirme, derleyicinizdeki uyarı düzeyini yükseltirken ve uyarıları hata olarak ele alırken 'varsayılan:' maddesini atlamaktır. Böylelikle, enum listesinin tamamını genişletirseniz, derleyici, anahtar deyiminizi uyarır ve siz de anahtarınızı genişletmenizi hatırlatır. Bazı insanlar her zaman bir ön tanıma sahip olmanız gerektiğini söyler, ama bunun aslında yardımın bulunmadığı bir senaryo olduğuna inanıyorum. –

cevap

38
enum Enum{ Banana, Orange, Apple } ; 
static const char * EnumStrings[] = { "bananas & monkeys", "Round and orange", "APPLE" }; 

const char * getTextForEnum(int enumVal) 
{ 
    return EnumStrings[enumVal]; 
} 
+17

Yalnızca sürekli enumlar için çalışır. – SasQ

+3

@SasQ, Burada daha kapsamlı bir cevabı var: http://stackoverflow.com/a/11586083/5987 Bu iş parçacığındaki diğer iyi öneriler de. –

+0

Daha iyi bir prototip, const char * getTextForEnum (int) const; En iyi pratik. –

9

Enum değerini ve dizeyi bir STL haritasına atabilirsiniz. Öyleyse böyle kullanabilirsin. ziyade uzun switch ifadesi daha anonim bir arama tablosu

return myStringMap[Enum::Apple]; 
19

Tür:

return (const char *[]) { 
    "bananas & monkeys", 
    "Round and orange", 
    "APPLE", 
}[enumVal];