2016-06-28 17 views
-2

Zum Beispiel habe ich eine EnumerationKompilierzeit Berechnung des nächsten Elements in enum?

enum Option 
{ 
    A = 0, B = 1, C = 2 
}; 

und ich mag neben dem Ergebnis seine Kompilierung erhalten, das heißt nextOf<A> = B, nextOf<B> = C, nextOf<C> = A, wie kann ich es umsetzen?

+1

Funktioniert 'myEnum + 1' nicht für Sie? –

+0

Möchten Sie eine Zustandsmaschine implementieren? – SHR

Antwort

2

Sie können constexpr verwenden, um eine Kompilierzeitfunktion zu schreiben.

#include <iostream> 

enum Option 
{ 
    A = 0, B = 1, C = 2 
}; 

constexpr Option nextOf(const Option option){ 
    switch (option){ 
    case A: return B; 
    case B: return C; 
    } 
    return A; 
} 

int main(){ 
    constexpr Option next = nextOf(A); 
} 
1

Ein anderer Ansatz könnte die Verwendung partieller Spezialisierungen einer Struktur sein.
Als Beispiel:

enum Option { A = 0, B = 1, C = 2 }; 

template<Option> 
struct next; 

template<> struct next<A> { static constexpr Option value = B; }; 
template<> struct next<B> { static constexpr Option value = C; }; 
template<> struct next<C> { static constexpr Option value = A; }; 

template<Option O> 
constexpr Option next_v = next<O>::value; 

int main(){ 
    constexpr Option next = next_v<A>; 
    static_assert(next_v<B> == C, "!"); 
} 
0

Da enum s ganze Zahlen sind in der Verkleidung, können Sie einfach

contexpr Option next(Option u) 
{ 
    return (Option(int(u)+1); 
} 

Oder Kurs definieren diese nächste (C) als undefiniertes Verhalten lassen. Die Alternative kann ein% 3 Ergebnis sein, so dass im nächsten (C) A (A Wrap-aroud arithmetischen typischen auf int-s) =

return (Option((int(u)+1)%3); 

oder einen Filter auf Eingabe, eine Ausnahme auszulösen, aber das wird machen die Funktion nicht mehr consterxpr.

Verwandte Themen