Bibliothèque d'énumérations réfléchissantes au moment de la compilation avec une syntaxe propre, dans un seul fichier d'en-tête et sans dépendances.
En C++11, tout peut être utilisé au moment de la compilation. Vous pouvez convertir vos énumérations, les parcourir en boucle, trouver leur maximum, appliquer des conventions de manière statique et transmettre les résultats sous forme d'arguments de modèle ou de fonctions constexpr
. Toute la réflexion est disponible pour vos besoins en métaprogrammation.
L'interface est la même pour C++98 : il vous suffit d'en utiliser la majeure partie au moment de l'exécution uniquement. Cette bibliothèque fournit des énumérations de portée et de taille, ce qui n'est pas intégré à C++98.
Voir la page du projet pour une documentation complète.
Ajoutez simplement enum.h
à votre projet.
iostream
. La plus grande limitation est que la macro BETTER_ENUM
ne peut pas être utilisée à l'intérieur d'une classe. Cela semble difficile à supprimer. Il existe une solution de contournement avec typedef
(ou 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;
Vous pouvez cependant utiliser BETTER_ENUM
dans un espace de noms.
La macro a une limite souple de 64 constantes déclarées. Vous pouvez l'étendre en suivant ces instructions. En fin de compte, le nombre de constantes est limité par le nombre maximum d'arguments de macro de votre compilateur.
Dans certains cas, il est nécessaire de préfixer des constantes telles que Channel::Red
avec un +
pour les promouvoir explicitement au type Channel
. Par exemple, si vous faites une comparaison :
channel == +Channel::Red
Sur msvc, vous devrez peut-être activer l'avertissement C4062 pour obtenir la vérification de l'exhaustivité du cas switch
.
La version originale de la bibliothèque a été développée par l'auteur au cours de l'hiver 2012-2013 chez Hudson River Trading, en remplacement d'un ancien générateur appelé BETTER_ENUM
.