2013-10-09 14 views
5

Chciałbym zacząć używać wyrażeń w kilku miejscach w moim kodzie, ale mam problem z poprzednimi deklaracjami z kompilatora. Sposób, w jaki obecnie deklarowane są enum, ma dla mnie najwięcej sensu:Najlepsza alternatywa dla wyliczeń z zakresem - Pre C++ 11

Jaki jest najlepszy sposób na uniknięcie takiej sytuacji?

enum score_methods_t {NONE,ABS_FROM_PERFECT,ERROR_SQUARED}; 
enum scale_methods_t {NONE,CASES_MULTIPLIER,RANGE_MULTIPLIER}; 

Czy powinienem zrobić wszystko, co unikalne, lub zakres z przestrzenią nazw? Chciałbym użyć typów enum w klasie, a NONE jest najbardziej opisową nazwą!

Również powód starcia z enumsami polega na tym, że w zasadzie są tylko # definicjami pod maską?

Odpowiedz

10

W pre-C++ 11 razy użyłem:

struct score_methods { enum type { NONE, ABS_FROM_PERFECT, ERROR_SQUARED }; }; 

który oznacza, że ​​zawsze masz score_methods::type dla rzeczywistego typu enum i score_methods::NONE itd. lub wartości.

Również nie, nie są one tylko #define s, ponieważ można je umieścić w różnych przestrzeniach nazw lub klasach (jak widać powyżej) i jest to coś, czego preprocesor nie może wykonać/obsłużyć.

+0

Przy użyciu tego podejścia, jak zadeklarować zmienne, członków klasy, argumenty funkcji typu wyliczenia? – ulidtko

+0

@ulidtko Używając ':: type', jak w' score_methods :: type'. To cena, którą płacisz w pre-C++ 11. :) –

+0

Tak ... Czy możemy zadeklarować element 'score_methods :: value' o tym samym typie wyliczenia i użyć jakiegoś niejawnego operatora przypisania struktury? To wygląda na bardziej bezpieczne dla mnie. – ulidtko

4

Zawsze można umieścić teksty stałe w klasie:

struct Score 
{ 
    enum Method { None, AbsFromPerfect, ErrorSquared }; 
}; 

Zastosowanie:

void foo(Score::Method m); 

foo(Score::None); 
+0

To nie jest tak bezpieczne jak "klasa enum", prawda? To znaczy. błędy typu 'foo (15)' będą typecheck i skompilować dobrze. – ulidtko

+0

@ulidtko: Nie, [które nie skompilowałoby się] (http://ideone.com/6wWorj) z powodu zwykłych reguł konwersji dla wyliczeń. –

Powiązane problemy