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.
fonte
2010-04-03 14:40:43
Mese & operator ++ (mese & it) { en = static_cast (static_cast (en) + 1); return en; } –
Stephen
Grazie, Stephen, per il codice. Basta pensare a cosa dovrebbe fare la funzione, se il mese è già dicembre. Modulo qualcuno? – sellibitze
@Stephen: non è necessario il cast per int, enum convertire in int (o più grande, se necessario) implicitamente per operazioni aritmetiche. –