2013-06-13 18 views
5

Ho un pezzo di codice molto simile a questo:Associare un char a un tipo enum

class someclass 
{ 
public: 
enum Section{START,MID,END}; 
vector<Section> Full; 
void ex(){ 
    for(int i=0;i<Full.size();i++) 
    { 
     switch (Full[i]) 
     { 
     case START : 
        cout<<"S"; 
        break; 
     case MID : 
        cout<<"M"; 
        break; 
     case END: 
      cout<<"E"; 
      break; 
     } 
    } 
    } 
}; 

Ora immaginate ho molto di più tipi enum e i loro nomi sono più .... bene quello che ottengo non è un buon codice di ricerca e mi chiedevo se possibile associare un char specifico per un tipo enum e forse fare qualcosa di simile:

for(int i=0;i<Full.size();i++) 
    { 
     cout<(Full[i]).MyChar(); 
    } 

o qualsiasi altro metodo che potrebbe rendere questo codice "più bella". È possibile?

+0

Si può sempre avere un 'std :: map ', ma io non sono certo che il codice risulterebbe più pulito con un set di valori così piccolo. Per lo meno si potrebbe incapsulare la conversione all'interno di una funzione in modo da poterla riutilizzare. – cdhowie

+2

Un 'std :: map' sembra eccessivo qui, un semplice array è sufficiente:' cout << "SME" [Full [i]] '. (Ciò richiede ancora miglioramenti per la gestibilità e la sicurezza.) – hvd

+0

Potrebbe essere anche un caso per l'intestazione #define. #define START 'S' ... –

risposta

9

Sfortunatamente non c'è molto che puoi fare per pulire questo. Se si ha accesso alla funzione enumeratore C++ 11 fortemente tipizzato, allora si potrebbe fare qualcosa di simile al seguente:

enum class Section : char { 
    START = 'S', 
    MID = 'M', 
    END = 'E', 
}; 

E allora si potrebbe fare qualcosa di simile:

std::cout << static_cast<char>(Full[i]) << std::endl; 

Tuttavia, se si non hanno accesso a questa funzione, allora non c'è molto che si può fare, il mio consiglio sarebbe quello di disporre di una mappa globale std::map<Section, char>, che riguarda ogni sezione enum ad un personaggio, o di una funzione di supporto con il prototipo:

inline char SectionToChar(Section section); 

Il che implementa la dichiarazione switch() in maniera più accessibile, per esempio:

inline char SectionToChar(Section section) { 
    switch(section) 
    { 
    default: 
     { 
      throw std::invalid_argument("Invalid Section value"); 
      break; 
     } 
    case START: 
     { 
      return 'S'; 
      break; 
     } 
    case MID: 
     { 
      return 'M'; 
      break; 
     } 
    case END: 
     { 
      return 'E'; 
      break; 
     } 
    } 
} 
+0

La prima soluzione sembra ottima, sfortunatamente non ho accesso ad essa. – petric

+0

Penso che sia necessario 'caso Section: START:' ecc.? – aschepler

+0

@aschepler No, non è necessario qualificare l'ambito di un 'enum globale non fortemente tipizzato. –

5

In una situazione come questa si potrebbe essere difficile e gettate le vostre caratteri.

enum Section{ 
    START = (int)'S', 
    MID = (int)'M', 
    END = (int)'E' 
}; 

... 

inline char getChar(Section section) 
{ 
    return (char)section; 
} 
+0

Sembra che funzioni, ma è "legale"? Intendo dire che è una buona programmazione? – petric

+1

È legale, sì. E 'una buona programmazione .. beh, senza sapere esattamente cosa stai cercando di ottenere, non posso rispondere. È più carino però. –

0

Penso che la soluzione migliore in questo caso sarebbe quella di utilizzare una mappa:

#include <iostream> 
#include <map> 
class someclass 
{ 
    public: 
    enum Section{START = 0,MID,END}; 
    map<Section,string> Full; 

    // set using Full[START] = "S", etc 

    void ex(){ 
     for(int i=0;i<Full.size();i++) 
     { 
      cout << Full[i]; 
     } 
    } 
}; 
Problemi correlati