Je suis un grand fan des fonctionnalités de typage fort de C++ et ce que j'aime le plus, c'est d'utiliser des énumérations tout en traitant des ensembles de données limités.Utiliser enum dans les boucles et la cohérence des valeurs
Mais énumérations manque quelques fonctionnalités utiles, par exemple les opérateurs:
enum class Hex : int
{
n00, n01, n02, n03,
n04, n05, n06, n07,
n08, n09, n10, n11,
n12, n13, n14, n15
};
for (Hex h = Hex::n0; h <= Hex::n15; ++h) // Oops! no 'operator ++'
{ /* ... */ }
est facile de se débarrasser de l'absence d'opérateurs créant un opérateur libre sur la même portée:
Hex &operator ++(Hex &h)
{
int r = static_cast<int>(Hex);
h = static_cast<Hex>(r + 1);
return h;
}
for (Hex h = Hex::n0; h <= Hex::n15; ++h) // Now the '++h' works!
{
std::cout << std::dec << int(h) << ": "
<< std::hex << int(h) << '\n';
}
Mais cette approche est plus une nuisance qu'une solution, car elle peut casser la limitation de valeur de l'énumération: l'application ++h
tandis que h
est égale à Hex::n15
mettra h à la valeur 16, qui est sur le Hex
portée des valeurs tandis que h
est toujours du type Hex
, Ce problème est plus évident dans d'autres énumérations:
enum class Prime : int
{
n00 = 2, n01 = 3, n02 = 5, n03 = 7,
n04 = 11, n05 = 13, n06 = 17, n07 = 19,
n08 = 23, n09 = 29, n10 = 31, n11 = 37,
n12 = 41, n13 = 43, n14 = 47, n15 = 53
};
Prime &operator ++(Prime &p)
{
// How to implement this?! will I need a lookup table?
return p;
}
Ce problème a été une surprise pour moi; Je pensais que stocker une valeur incorrecte dans une valeur d'énumération jetterait une exception. Donc, pour l'instant, je me demandais s'il y a une façon élégante de traiter les faiblesses de cette énumération, les objectifs que je veux atteindre sont les suivants:
- trouver un moyen confortable d'utiliser des valeurs d'énumération dans les boucles.
- Assurer la cohérence des données d'énumération entre les opérations.
Questions supplémentaires:
- Y at-il une raison de ne pas lancer une exception lorsqu'une données d'énumération obtient une valeur qui est hors de ses valeurs possibles?
- Il existe un moyen de déduire le type associé à une classe d'énumération ?, le type
int
dans les énumérationsHex
etPrime
.
Si vous souhaitez parcourir, n'utilisez pas d'énumérations. – Pubby
La fuite de fonction est en effet assez dangereuse ... –
On peut dire que le premier problème se manifeste seulement parce que vous êtes absents des énumérations - vous les utilisez pour énumérer les entiers! C'est mieux fait avec des entiers réels. Le deuxième problème (énumération des nombres premiers) est non trivial. –