Seite 1 von 1

enum class oder namespace?

Verfasst: Fr Aug 22, 2014 10:15 pm
von Architekt
Hallo,
Ich wollte euch fragen, welche Möglichkeit ihr wählen würdet.
Ausgangssituation ist, dass ich in einer Aufzählung verschiedene OpenGL Typen haben möchte, diese aber Typ-Sicher machen will.
Dazu bieten sich zwei Möglichkeiten (IMO):

Code: Alles auswählen

enum class Geometry {
    Quad = GL_QUADS,
    Triangle = GL_TRIANGLES
    // ...
};
oder

Code: Alles auswählen

namespace Geometry {
	enum Type {
	    Quad = GL_QUADS,
	    Triangle = GL_TRIANGLES
	    // ...
	};
}
Das Manko der ersten Variante ist eben, dass ich, um auf den dahinterliegenden Wert zuzugreifen, einen cast brauche:

Code: Alles auswählen

static_cast<GLenum>
Also: was würdet ihr eher wählen?

Re: enum class oder namespace?

Verfasst: So Aug 24, 2014 10:02 pm
von Xin
Architekt hat geschrieben:Ich wollte euch fragen, welche Möglichkeit ihr wählen würdet.
Ich schreibe in der Regel "Enum-Klassen", die statische Member enthalten. Der Zeiger auf das statische Element ist das Unterscheidungsmerkmal, an die Klasse kann ich dann weiterhin beliebige Informationen und Methoden hängen.

Code: Alles auswählen

.h
class Geometry
{
private:
  GlEnum Value;
  Geometry() {} // keine uminitialisierten Werte
  Geometry( GlEnum value )  // keine neuen Werte
    : Value( value ){}
  Geometry( Geometrie const & copy ) {} // keine Kopien
public:
  static Geometry Quads, Triangles;

  operator GlEneum() { return Value; }
};

.cpp
Geometry const Geometry::Quads( GL_QUADS );
Geometry const Geometry::Triangle( GL_TRIANGLES );


Re: enum class oder namespace?

Verfasst: Mo Aug 25, 2014 6:24 am
von mfro
Architekt hat geschrieben:

Code: Alles auswählen

enum class Geometry {
    Quad = GL_QUADS,
    Triangle = GL_TRIANGLES
    // ...
};
...
Das Manko der ersten Variante ist eben, dass ich, um auf den dahinterliegenden Wert zuzugreifen, einen cast brauche:

Code: Alles auswählen

static_cast<GLenum>
Also: was würdet ihr eher wählen?
Die "enum classes" sind ein C++11-Feature für typsichere enums.

Wenn man das verwenden will (was grundsätzlich sicher kein Fehler ist), muß man sich wohl - zumindest solange, bis das Feature auch dort Einzug gefunden hat - typsichere Inline-Wrapper um die entsprechenden C-Funktionen schreiben (also den notwendigen cast "verstecken"), die man damit aufrufen will, sonst hat man ja nur die halbe (und damit keine) Typsicherheit.

Re: enum class oder namespace?

Verfasst: Mo Aug 25, 2014 8:30 am
von Architekt
Ich hab das ganze nun mittels des zweiten Lösungsweges gelöst. Der cast gefiel mir nicht. :)