88 votes

Valeurs maximales et minimales dans un enum C++.

Existe-t-il un moyen de trouver les valeurs maximales et minimales définies d'un enum en c++ ?

0 votes

Jetez un coup d'œil à la github.com/Neargye/magic_enum lib

3 votes

Une raison pour laquelle je pourrais vouloir connaître la valeur maximale d'une énumération sans l'ajouter à l'énumération elle-même est que mon compilateur ne se plaint pas (C4061) lorsque mon instruction 'switch' ne gère pas explicitement la valeur 'max value'.

105voto

Jeff Yates Points 36725

Non, il n'existe aucun moyen de trouver les valeurs maximales et minimales définies d'un enum en C++. Lorsque ce type d'information est nécessaire, il est souvent bon de définir une valeur Last et First. Par exemple,

enum MyPretendEnum
{
   Apples,
   Oranges,
   Pears,
   Bananas,
   First = Apples,
   Last = Bananas
};

Il n'est pas nécessaire d'avoir des valeurs nommées pour chaque valeur entre First y Last .

3 votes

Toujours utile pour les enums non séquentiels - tant que vous ne vous attendez pas à ce que chaque valeur existe.

0 votes

@Adrian : Oui, c'est vrai. Il n'est pas nécessaire que chaque valeur ait un nom défini pour que cette technique soit utile. Je vais modifier en conséquence

0 votes

Ok, mais vous devez maintenir sa valeur si de nouveaux sont ajoutés.

33voto

dalle Points 9083

Non, pas dans le C++ standard. Vous pouvez le faire manuellement :

enum Name
{
   val0,
   val1,
   val2,
   num_values
};

num_values contiendra le nombre de valeurs de l'énumération.

1 votes

Num_values contiendra les nombres-1 de valeurs

15 votes

@lizusek : num_values contiendra le nombre de valeurs de l'énumération, à l'exception de num_values lui-même.

3 votes

@dalie oui, c'est pourquoi ce sera : nombre de valeurs - 1. Bien sûr, je sais que vous voulez dire une valeur qui signifie les valeurs à l'exception de la dernière qui n'est pas une valeur réelle, mais une aide. Cependant, je suggère de rendre les choses plus claires.

7voto

Justsalt Points 1083

Non. Un enum en C ou C++ est simplement une liste de constantes. Il n'existe pas de structure supérieure qui puisse contenir de telles informations.

Habituellement, lorsque j'ai besoin de ce type d'information, j'inclus dans l'enum une valeur maximale et minimale, comme ceci :

enum {
  eAaa = 1,
  eBbb,
  eCccc,
  eMin = eAaaa,
  eMax = eCccc
}

Voir cette page web pour quelques exemples de l'utilité de ce système : Trucs stupides d'Enum

1 votes

L'article que vous mettez en lien date d'une époque où le compilateur des auteurs "ne supporte pas le nouveau type booléen officiel du C++" .... Je n'ai jamais lu quelque chose d'aussi ancien auparavant :P.

6voto

Tiendil Points 211
  enum My_enum
    {
       FIRST_VALUE = 0,

       MY_VALUE1,
       MY_VALUE2,
       ...
       MY_VALUEN,

       LAST_VALUE
    };

après la définition, My_enum::LAST_VALUE== N+1

-6voto

Wael Points 11

Vous n'en avez même pas besoin, ce que je fais c'est juste que je dis par exemple si vous avez :

enum Name{val0,val1,val2};

si vous avez une instruction switch et que vous voulez vérifier si la dernière valeur a été atteinte, faites comme suit :

if(selectedOption>=val0 && selectedOption<=val2){

   //code
}

22 votes

C'est une solution très fragile. Si vous ajoutez une nouvelle valeur d'enum, vous devez passer en revue toute votre base de code pour mettre à jour ces tests.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X