2010-04-03 12 views
9

Ist es möglich, Operatoren für Aufzählungen zu definieren? Zum Beispiel habe ich enum Monat in meiner Klasse und ich würde gerne in der Lage sein, ++ my_month zu schreiben.
Dank
P. S.
Um wie dies Ich habe etwas zu vermeiden, überfüllt:Operatoren für Aufzählungen Überlastung

void Date::add_month() 
{ 
    switch(my_month_) 
    { 
    case Dec: 
     my_month_ = Jan; 
     add_year(); 
     break; 
    default: 
     ++my_month_; 
     break; 
    } 
} 

Antwort

11

Ja, es ist. Das Überladen von Operatoren kann für alle benutzerdefinierten Typen durchgeführt werden. Das schließt Enums ein.

+2

Monat & Operator ++ (Monat & en) { de = static_cast (statischer_cast (de) + 1); Rückkehr en; } – Stephen

+0

Danke, Stephen, für den Code. Man muss nur darüber nachdenken, was die Funktion tun soll, wenn der Monat bereits Dezember ist. Modulo jemand? – sellibitze

+0

@Stephen: Sie brauchen nicht die Umwandlung in int, Enums implizit in int (oder größer, falls erforderlich) für arithmetische Operationen konvertieren. –

12

Ja, Sie können:

enum Month 
{ 
    January, 
    February, 
    // ... snip ... 
    December 
}; 

// prefix (++my_month) 
Month& operator++(Month& orig) 
{ 
    orig = static_cast<Month>(orig + 1); // static_cast required because enum + int -> int 
    //!!!!!!!!!!! 
    // TODO : See rest of answer below 
    //!!!!!!!!!!! 
    return orig; 
} 

// postfix (my_month++) 
Month operator++(Month& orig, int) 
{ 
    Month rVal = orig; 
    ++orig; 
    return rVal; 
} 

Allerdings müssen Sie eine Entscheidung darüber treffen, wie zu handhaben Ihre Enum „überfüllt“. Wenn my_month gleich Dezember ist und Sie die Anweisung ++my_month ausführen, wird my_month immer noch numerisch äquivalent zu Dezember + 1 und hat keinen entsprechenden benannten Wert in der enum. Wenn Sie dies zulassen, müssen Sie davon ausgehen, dass Instanzen des Enums außerhalb der Grenzen liegen können. Wenn Sie vor dem Inkrementieren auswählen, ob Sie nach orig == December suchen möchten, können Sie den Wert auf Januar zurückstellen und dieses Problem beseitigen. Dann haben Sie jedoch die Informationen verloren, die Sie in ein neues Jahr übertragen haben.

Die Umsetzung (oder deren Fehlen) des TODO Abschnitt wird stark auf Ihren individuellen Anwendungsfall abhängen.