2010-04-03 2 views
9

È possibile definire operatori per enumerazioni? Ad esempio, ho un mese enum nella mia classe e mi piacerebbe poter scrivere ++ my_month.
Grazie
P.S.
Al fine di evitare traboccare ho fatto qualcosa di simile:Operatori che sovraccaricano per enumerazione

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

risposta

11

Sì, lo è. L'overloading dell'operatore può essere eseguito per tutti i tipi definiti dall'utente. Ciò include le enumerazioni.

+2

Mese & operator ++ (mese & it) { en = static_cast (static_cast (en) + 1); return en; } – Stephen

+0

Grazie, Stephen, per il codice. Basta pensare a cosa dovrebbe fare la funzione, se il mese è già dicembre. Modulo qualcuno? – sellibitze

+0

@Stephen: non è necessario il cast per int, enum convertire in int (o più grande, se necessario) implicitamente per operazioni aritmetiche. –

12

Sì, è possibile:

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; 
} 

Tuttavia, è necessario prendere una decisione su come gestire "traboccante" il tuo enum. Se my_month è uguale a dicembre e si esegue l'istruzione ++my_month, my_month diventerà ancora numericamente equivalente a December + 1 e non avrà alcun valore denominato corrispondente nell'enum. Se si sceglie di consentire ciò, si deve presumere che le istanze dell'enumerazione potrebbero essere fuori limite. Se si sceglie di verificare orig == December prima di incrementarlo, è possibile riportare il valore a gennaio ed eliminare questa preoccupazione. Poi, tuttavia, hai perso le informazioni che hai trasferito in un nuovo anno.

L'implementazione (o la mancanza di) della sezione TODO dipenderà molto dal caso d'uso individuale.