6
votes

Existe-t-il un moyen de trouver la cardinalité (taille) d'un énumé en C ++?

pourrait-on écrire une fonction qui renvoie le nombre d'éléments dans un énorme? Par exemple, disons que j'ai défini: xxx

puis f (e) retournerait 3.


0 commentaires

4 Réponses :


18
votes

Nope.

S'il y en avait, vous ne verriez pas beaucoup de code comme celui-ci: xxx

Notez que ce code est également un indice pour un (méchant ) Solution - Si vous ajoutez un élément de "garde" final, et n'indiquez pas explicitement les valeurs des champs Enum, alors le dernier élément "Count" aura la valeur que vous recherchez - cela se produit parce que l'énumûte compte est basé sur zéro: xxx


3 commentaires

Merci, cela semble être aussi bon qu'une solution que je vais venir avec.


Lequel bien sûr ne fonctionne que pour des énums continus. Si vous avez déjà un «trou» comme dans une liste de code d'erreur, vous êtes vissé.


J'ai posté une macro simple qui fait le tour et gère les problèmes "trous".



2
votes

Non. Pour une chose, vous ne pouvez pas prendre de types comme paramètres (juste des instances de types)


0 commentaires

3
votes

Non, c'est un VFAQ et la réponse est non !!

pas sans kilomper de toute façon.

Même ce truc sur l'entrée finale ne fonctionne que si aucune des valeurs ne fonctionne que . E. g., xxx


2 commentaires

Merci. Désolé de répéter un VFAQ - j'ai effectué la recherche ici et le plus grand Web, et je n'ai trouvé aucun cas de cette question.


Aucun problème. Je cherchais que cela me suffit souvent de savoir que les gourous disent "Cain pas être Dun"



4
votes

Il existe des moyens, mais vous devez travailler ... un peu :)

Fondamentalement, vous pouvez l'obtenir avec une macro. p> xxx pré>

Comment ça marche ? p>

#include <boost/preprocessor/seq/enum.hpp>
#include <boost/preprocessor/seq/size.hpp>

#define DEFINE_NEW_ENUM(Type_, Values_)\
  typedef enum { BOOST_PP_SEQ_ENUM(Values_) } Type_;\
  size_t count(Type_) { return BOOST_PP_SEQ_SIZE(Values_); }


2 commentaires

+1 parce que ça marche. Bien que je ne suis pas sûr d'avoir envie de la syntaxe de déclaration.


Eh bien, il y a quelques structures à choisir (tableau, liste, séquence et tuple), j'aurais pu utiliser un tuple pour définir_new_enum (myenum, (VAL1, VAL2, VAL3 = 6)); . C'était simplement une démonstration de l'utilité des macros :)