2013-10-09 14 views
5

Ich möchte an einigen Stellen in meinem Code Enums verwenden, aber ich habe ein Problem mit früheren Deklarationen vom Compiler. Wie die enums derzeit deklariert werden, macht für mich am meisten Sinn:Beste Alternative für bereichsspezifische Enums - Pre C++ 11

Wie kann man eine Situation wie diese am besten vermeiden?

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

Soll ich einfach alles einzigartig machen, oder Bereich mit Namespace? Ich möchte die Enum-Typen innerhalb einer Klasse verwenden und NONE ist der aussagekräftigste Name!

Ist auch der Grund, dass die enums kollidieren, weil im Wesentlichen thay nur #defines unter der Haube sind ??

Antwort

10

In Pre-C++ 11-mal, habe ich:

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

die bedeutet, Sie haben immer score_methods::type für die tatsächliche enum Typ und score_methods::NONE, etc. f oder die Werte.

Auch, nein, sie sind nicht nur #define s, wie Sie sie in verschiedene Namespaces oder Klassen (wie oben) setzen können und das ist etwas, was der Präprozessor nicht tun/behandeln kann.

+0

Mit diesem Ansatz, wie deklarieren Sie Variablen, Klassenmember, Funktionsargumente des Aufzählungstyps? – ulidtko

+0

@ulidtko Verwendung von ':: type', wie in' score_methods :: type'. Das ist der Preis, den Sie in Pre-C++ 11 bezahlen. :) –

+0

Yeah ... Können wir ein 'score_methods :: value'-Member vom selben Enum-Typ deklarieren und den impliziten struct-Zuweisungsoperator verwenden? Das sieht für mich viel typsicher aus. – ulidtko

4

Sie können jederzeit die Aufzählungen in einer Klasse setzen:

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

Verbrauch:

void foo(Score::Method m); 

foo(Score::None); 
+0

Dies ist nicht so sicher wie 'enum class', oder? I.e. Tippfehler wie 'foo (15)' würden typecheck und kompilieren einfach gut. – ulidtko

+0

@ulidtko: Nein, [das würde nicht kompilieren] (http://ideone.com/6wWorj) wegen der üblichen Konvertierungsregeln für enums. –