Über enum iterieren



  • Ich bin auf der Suche nach einer guten Implementation um über alle Elemente eines enum-Typs zu iterieren.
    Beispiel 1:

    enum Monate {Januar, Februar, Maerz, April, Mai};
    for (Monate M = Januar; M <= Mai;)
    {
        printf("%d\n", Monat);    
        M = M + 1;
    }
    

    Der ++ Operator lässt sich ja leider nicht benutzen, da es sich um Konstanten handelt. Gibts da noch ne andere Möglichkeit?

    Interessant wirds jetzt beim Beispiel 2:

    enum Monate {Januar, Februar = 6, Maerz, April = 13, Mai};
    

    Nun würde meine for-Schleife auch Werte liefern, die in meinem Typ Monate gar nicht auftauchen. Als Ergbnis erwarte ich sowas wie 0, 6, 7, 13, 14. Hat jemand ne Idee sowas am besten zu implementieren?



  • Theoretisch wäre op++ schon die richtige Lösung, aber der ist für "normale" enums nicht vorgesehen (bzw. orientiert sich nicht daran, welche enum-Werte tatsächlich verwendet werden). Aber afaik gelten enum's als benutzerdefinierte Typen, also könntest du dir den op++ selber überladen, so daß er in der von dir gewünschten Reihenfolge durch die Werte läuft.



  • Dann müsste ich das ganze in einer Klasse kapseln. Ich wüßte dann aber immer noch nicht, wie ich das nächste Element bestimmen könnte, außer ich benutze keine enums.



  • ZzetT schrieb:

    Dann müsste ich das ganze in einer Klasse kapseln.

    Wieso? Du kannst Operatoren auch global definieren.

    Ich wüßte dann aber immer noch nicht, wie ich das nächste Element bestimmen könnte, außer ich benutze keine enums.

    Diese Zuordnung mußt du auch selber kennen und von Hand umsetzen (z.B. als switch-case-Zuordnung). Die "normalen" enum-Operatoren basieren üblicherweise auf einer impliziten Umwandlung nach int, so daß sie auch undefinierte Zwischenwerte zurückliefern können.

    (und ich kenne nur eine Möglichkeit festzustellen, ob ein int im Wertebereich eines gegebenen enum's ist: Vergleich mit allen erlaubten enum-Konstanten)



  • Hehe, das klappt sogar. Probleme gibt es allerdings, wenn der oberste Wert des enums eine Zweierpotenz - 1 ist, dann muss man sich etwas anderes ausdenken:

    enum test {
        first = 1,
        second = 3,
        third = 7,
        fourth = 10
    };
    
    test& operator++(test& t)
    {
        switch (t) {
            case first:    t = second; break;
            case second:   t = third; break;
            case third:    t = fourth; break;
            case fourth:   t = test(fourth + 1); break;
        }
    
        return t;
    }
    
    int main (int argc, char * const argv[])
    {
        for (test i = first; i <= fourth; ++i)
            cout << i << endl;
    }
    


  • Hab grad keinen Compiler zur Hand, aber das dürfte auch funktionieren:

    for(Monate M = Januar, M <= Mai, M=Monate(M+1))
    

    Kein Plan, wie das aussieht wenn du da Sprünge zwischen den Werten hast ..


Anmelden zum Antworten