2010-09-03 11 views
0

ENUM question.par énumérations Itérer en C++ C++

J'ai une liste de fichiers et leurs papiers d'identité que je dois parcourir et faire des choses à. La plupart des choses sont les mêmes, mais il y a quelques choses spécifiques au fichier qui doivent être faites. J'ai essayé de mettre les identifiants de fichiers dans une énumération, et d'itérer sur cela. Cependant, les ID de fichier ne sont pas contigus et sautent.

Actuellement, j'ai quelque chose de semblable à ce

for(int i = 0; i < FILE_ENUM_MAX; i++) 
{ 
    currentFile = myEnum(i); 
    // do stuff 
} 

enum myEnum { 
    file1 = 0x1111, 
    file2 = 0x8000, 
    file3 = 0x75, 
    file4 = 0x120, 
    FILE_ENUM_MAX = 4 
} 

Cela ne fonctionne pas; Je passe simplement par les fichiers 0, 1, 2 et 3. J'ai l'impression que je ne peux pas obtenir le Nième élément d'une énumération en demandant l'item N. Alors quel serait le meilleur moyen de parcourir cette énumération? Ou devrais-je m'en débarrasser? Je pourrais probablement mettre les articles dans l'ordre numérique, mais je préférerais une solution à l'endroit où l'ordre n'a pas d'importance.

+0

double possible de [C++: itérer un ENUM] (http : // stackoverflow.com/questions/261963/c-iterate-through-an-enum) – Joe

+0

Quelques bonnes choses dans le message en double. – Joe

Répondre

4

Je pense que la réponse basse technologie pourrait être de sauter le ENUM, et il suffit de créer un tableau statique:

#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0])) 

int FILE_ENUM[] = { 0x1111, 0x8000, 0x75, 0x120 }; 

for(int i = 0; i < ARRAYSIZE(FILE_ENUM); i++) { 
    currentFile = myEnum[i]; 
    // do stuff 
} 

TJ

+0

+1: tu m'as battu de 40 secondes. –

+1

Oui, jusqu'à ce que vous deviez changer le numéro de dossier 54 de façon permanente. Maintenant, est-il facile de compter 54 éléments dans une liste de 324? Je préfère les constructions de niveau supérieur pour la lisibilité et autres. Pour chacun son propre :) –

+0

Puis-je supposer que vous utilisez une macro pour la taille parce que vous voulez du code compatible C? En C++, c'est certainement inutile. –

4

Malheureusement, C++ ne fournit pas un moyen de itérer énumérations comme vous voulez.

+0

On peut être écrit, voir ma réponse :) – DanteTheSmith

1

J'ai deux suggestions:

  1. Utilisez un std::vector pour contenir les énumérations.
  2. Utilisez un std::map pour contenir les énumérations.

Solution 2 offre un avantage lorsque la clé est l'ID de fichier et la valeur peut être le nom du fichier (ou un objet contenant des attributs du fichier, comme un descripteur de fichier ou pointeur) .

0

i < = FILE_ENUM_MAX et itérera avec le fichier 4. Désolé si c'est un vieux fil mais peut-être que quelqu'un aura toujours besoin d'une réponse essayant de le trouver ici.

0

Probablement la meilleure réponse est la suivante: Pourquoi voudriez-vous besoin/pas vous?

Soit utiliser le tableau ou la liste ou quelque chose que vous pouvez facilement parcourir.

Si vous avez besoin d'être opt immuable pour ReadOnlyCollection ou

ImmutableArray

Maintenant, pour répondre à la question - Jetez un oeil à ceci: ->fiddle diddle Non seulement il est itérer les valeurs de creux, il affiche les noms et numéros sous-jacents . Et cela illustre que vous pouvez avoir le même nombre pour différents noms dans une énumération.

Ou peut-être que vous pensez dans les lignes de celle-ci:

public static IEnumerable<T> GetValues<T>() { 
    return (T[])Enum.GetValues(typeof(T)) 
} 

Si je ne me trompe pas, je choisi ce truc sympa de - https://stackoverflow.com/a/972323/5439782