Reflektierende Enum-Bibliothek zur Kompilierungszeit mit sauberer Syntax, in einer einzigen Header-Datei und ohne Abhängigkeiten.
In C++11 kann alles zur Kompilierzeit verwendet werden. Sie können Ihre Aufzählungen konvertieren, sie durchlaufen, ihr Maximum ermitteln, Konventionen statisch erzwingen und die Ergebnisse als Vorlagenargumente oder an constexpr
-Funktionen weitergeben. Die gesamte Reflexion steht für Ihre Metaprogrammierungsanforderungen zur Verfügung.
Die Schnittstelle ist für C++98 dieselbe – Sie müssen sie nur größtenteils zur Laufzeit verwenden. Diese Bibliothek stellt Aufzählungen mit Gültigkeitsbereich und Größe bereit, was in C++98 nicht integriert ist.
Die vollständige Dokumentation finden Sie auf der Projektseite.
Fügen Sie einfach enum.h
zu Ihrem Projekt hinzu.
iostream
der Fall ist. Die größte Einschränkung besteht darin, dass das BETTER_ENUM
-Makro nicht innerhalb einer Klasse verwendet werden kann. Dies scheint schwierig zu entfernen. Es gibt eine Problemumgehung mit typedef
(oder C++11 using
):
BETTER_ENUM (SomePrefix_Color, uint8_t , Red, Green, Blue)
struct triplet {
typedef SomePrefix_Color Color;
Color r, g, b;
};
triplet::Color color;
Sie können BETTER_ENUM
jedoch innerhalb eines Namespace verwenden.
Das Makro hat eine weiche Grenze von 64 deklarierten Konstanten. Sie können es erweitern, indem Sie dieser Anleitung folgen. Letztendlich wird die Anzahl der Konstanten durch die maximale Anzahl der Makroargumente Ihres Compilers begrenzt.
In manchen Fällen ist es notwendig, Konstanten wie Channel::Red
ein +
voranzustellen, um sie explizit zum Typ Channel
heraufzustufen. Wenn Sie beispielsweise einen Vergleich durchführen:
channel == +Channel::Red
Auf msvc müssen Sie möglicherweise die Warnung C4062 aktivieren, um eine Vollständigkeitsprüfung switch
Groß- und Kleinschreibung zu erhalten.
Die Originalversion der Bibliothek wurde vom Autor im Winter 2012-2013 bei Hudson River Trading als Ersatz für einen älteren Generator namens BETTER_ENUM
entwickelt.