429 Stimmen

Wie kann ich über eine Aufzählung iterieren?

Mir ist gerade aufgefallen, dass man die Standard-Mathematik-Operatoren nicht auf eine enum wie zum Beispiel ++ o += .

Wie kann man also am besten durch alle Werte in einer C++-Datei iterieren? enum ?

0voto

kcrossen Punkte 159

Wenn Sie wüssten, dass die Enum-Werte sequentiell sind, zum Beispiel das Qt:Key-Enum, könnten Sie das:

Qt::Key shortcut_key = Qt::Key_0;
for (int idx = 0; etc...) {
    ....
    if (shortcut_key <= Qt::Key_9) {
        fileMenu->addAction("abc", this, SLOT(onNewTab()),
                            QKeySequence(Qt::CTRL + shortcut_key));
        shortcut_key = (Qt::Key) (shortcut_key + 1);
    }
}

Es funktioniert wie erwartet.

0voto

Justin Moloney Punkte 17
typedef enum{
    first = 2,
    second = 6,
    third = 17
}MyEnum;

static const int enumItems[] = {
    first,
    second,
    third
}

static const int EnumLength = sizeof(enumItems) / sizeof(int);

for(int i = 0; i < EnumLength; i++){
    //Do something with enumItems[i]
}

0voto

DrumM Punkte 2057

Mit einem Lambda, fand ich dies die beste (modern) Weg der Schleife über Enums. Dadurch wird die Abstraktion stark verbessert. Man kann es sogar zu einer Vorlage machen, so dass es auf jede Enum anwendbar ist. Dieser Code gibt Ihnen auch keine Probleme mit clang(-tidy).

#include <functional>

/// @brief Loop over all enum values where the last enum value is the invalid one
void forEachAction(std::function<void(Enum)> &&doThis) {
    for (int value = 0; value = static_cast<int>(Enum::LastValue); ++value ) {
        doThis(static_cast<Enum>(value ));
    }
}

...

forEachAction([this](Enum value) {
    ...  // what you want to execute for every enum
});

-1voto

SylvainD Punkte 1673

Die meisten Lösungen basieren auf Schleifen über den (MIN, MAX)-Bereich, übersehen aber die Tatsache, dass die Aufzählung Löcher enthalten kann.

Meine Vorschläge sind:

        for (int i = MYTYPE_MIN; i <= MYTYPE_MAX; i++) {
            if (MYTYPE_IsValid(i)) {
                MYTYPE value = (MYTYPE)i;
                // DoStuff(value)
            }   
        }

-2voto

mathreadler Punkte 428

Erstellen Sie einfach ein Array von Ints und führen Sie eine Schleife über das Array durch, aber lassen Sie das letzte Element -1 sagen und verwenden Sie es als Ausstiegsbedingung.

Wenn enum ist:

enum MyEnumType{Hay=12,Grass=42,Beer=39};

dann Array erstellen:

int Array[] = {Hay,Grass,Beer,-1};

for (int h = 0; Array[h] != -1; h++){
  doStuff( (MyEnumType) Array[h] );
}

Dies funktioniert unabhängig von der Anzahl der Ints in der Darstellung, solange -1 check natürlich nicht mit einem der Elemente kollidiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X