Enums in Namespaces verpacken?
-
Hallo.
Ich habe mich jetzt schon öfter über das verhalten von enums bei c++ gewundert und ich habe immer noch keine besonders gute Lösung gefunden...
Anmerkung zu allen folgenden Beispielen: Ich habe die Beispiele gerade nicht getestet, sondern aus dem Gedächtnis rezitiert, es kann also auch sein, dass ich was falsch in Erinnerung habe.Wie ich es haben will ist eigentlich wie es in java ist, soll heißen, die Elemente im enum kann man nicht direkt benutzen, ohne :: (oder . bei java), so das auch keine namenskonflikte entstehen und gleichzeitig soll man den namen der enum auch als typ (rückgabe, parameter, variable) benutzen können.
So dann gibts da ja verschiedene Ansätze:
enum Farbe {Rot, Gruen, Blau};Problem: folgendes geht:
Farbe f = Rot;Und was noch viel schlimmer ist, dabei können namenskonflikte entstehen.
Ich will dass das nur geht, wenn man folgendes macht:
Farbe f = Farbe::Rot;Meine Lösung: namespace
namespace Farbe { enum Farbe {Rot, Gruen, Blau}; }Anwendung:
Farbe::Farbe f = Farbe::Rot;Da stört mich, dass man beim Typ Farbe :: davorschreiben muss....
Dann nächste Idee:
using namespace Farbe;Problem: Farbe ist sowohl namespace als auch enum name also uneindeutig und compilerfehler.
Lösung wäre, den namespace anders als die enum zu nennen, aber ich hab auch keine lust mir jedes mal nen alternativen namen auszudenken...
Und wenn using namespace drin ist kann man soweit ich weiß auch wieder
Farbe f = Rot;machen, was ich ja nicht wollte...
Das ist zwar nicht so schlimm, aber dann muss man sich trotzdem nen neuen namen ausdenken und immer using namespace machen.Was also tun?
Wie handhabt ihr das?
-
Ich benutze enum class aus C++0x.
-
Ich nehme meist statt dem namespace ein struct. Wenn das enum zu einer Klasse gehört dann kommt es eben da mit rein.
MrEnum schrieb:
Da stört mich, dass man beim Typ Farbe :: davorschreiben muss....
Das finde ich eher einen Vorteil. Das bischen mehr Schreibarbeit erzeugt für mich mehr Übersicht.
-
Braunstein schrieb:
MrEnum schrieb:
Da stört mich, dass man beim Typ Farbe :: davorschreiben muss....
Das finde ich eher einen Vorteil. Das bischen mehr Schreibarbeit erzeugt für mich mehr Übersicht.
Ich glaube er meint das doppelte Farbe::Farbe:
Farbe::Farbe f = Farbe::Rot;Er möchte lieber:
Farbe f = Farbe::Rot;
-
Mir ist schon klar, das er das meint. Ich sehe aber auch da kein Problem.
-
Ich hätte da mal eine Idee, aber ich hab's nicht ausprobiert: Man kann doch einzelne Sachen aus Namespaces bekannt machen. Könnte man dann nicht sowas schreiben:
namespace Farbe { enum Farbe { Rot, Gruen, Blau }; }Und dann nur
using Farbe::Farbe;So dass man Farbe als Typ schreiben kann, ohne Farbe::Farbe schreiben zu müssen. Aber der Rest geht weiterhin nur über den Namespacenamen.
Alternative: Nicht gerade elegant, aber zweckmäßig:
enum Farbe { Farbe_Rot, Farbe_Gruen, Farbe_Blau };
-
Ich mach das meistens so:
struct color_id { enum Enum { Red, Green, Blue }; }; typedef color_id::Enum ColorId; ColorId i = color_id::Red;