Wie kann ich über eine Aufzählung iterieren?

Mir ist gerade aufgefallen, dass man keine Standard-Mathe-Operatoren für eine Aufzählung wie ++ oder += verwenden kann.

Wie kann man also am besten alle Werte in einer C++-Enum durchlaufen?

Lösung

Die typische Vorgehensweise ist wie folgt:

enum Foo {
  One,
  Two,
  Three,
  Last
};

for ( int fooInt = One; fooInt != Last; fooInt++ )
{
   Foo foo = static_cast(fooInt);
   // ...
}

Bitte beachten Sie, dass die Aufzählung Last dazu gedacht ist, von der Iteration übersprungen zu werden. Wenn Sie diese "gefälschte" Last-Enum verwenden, müssen Sie Ihre Abschlussbedingung in der for-Schleife nicht jedes Mal auf die letzte "echte" Enum aktualisieren, wenn Sie eine neue Enum hinzufügen wollen. Wenn Sie später weitere Enums hinzufügen möchten, fügen Sie sie einfach vor Last ein. Die Schleife in diesem Beispiel funktioniert trotzdem.

Dies funktioniert natürlich nicht, wenn die Enum-Werte angegeben werden:

enum Foo {
  One = 1,
  Two = 9,
  Three = 4,
  Last
};

Dies verdeutlicht, dass eine Aufzählung nicht wirklich zum Durchlaufen gedacht ist. Die typische Art, mit einer Aufzählung umzugehen, ist die Verwendung in einer switch-Anweisung.

switch ( foo )
{
    case One:
        // ..
        break;
    case Two:  // intentional fall-through
    case Three:
        // ..
        break;
    case Four:
        // ..
        break;
     default:
        assert( ! "Invalid Foo enum value" );
        break;
}

Wenn Sie wirklich eine Aufzählung vornehmen wollen, packen Sie die Enum-Werte in einen Vektor und iterieren Sie über diesen. Dadurch werden auch die angegebenen Enum-Werte korrekt verarbeitet.

Kommentare (8)

Mit einer Aufzählung geht das nicht. Vielleicht ist eine Aufzählung nicht die beste Lösung für Ihre Situation.

Eine gängige Konvention ist es, den letzten Enum-Wert als MAX zu bezeichnen und diesen zur Steuerung einer Schleife mit einem int zu verwenden.

Kommentare (0)

C++ verfügt nicht über Introspektion, so dass Sie diese Art von Dingen nicht zur Laufzeit bestimmen können.

Kommentare (7)