2012-07-12 11 views
129

Powiel możliwe:
Generic way to cast int to enum in C++Jak rzucić int do wyliczenia w C++?

Jak mogę rzucać int do wyliczenia w C++?

Na przykład:

enum Test 
{ 
    A, B 
}; 

int a = 1; 

Jak przekonwertować a do rodzaju testu :: A?

+84

podoba mi się fakt, że ma to negatywny wynik, oznaczonej jako powielone ale jest najlepsze wyniki podczas wyszukiwania Google dla "C++ int to enum" – Rickard

+1

[link] (http://www.enel.ucalgary.ca/People/Norman/enel315_winter1997/enum_types/) Notatka że nie ma znaczenia, czy int pasuje do jednej ze stałych typu wyliczeniowego; Konwersja typu jest zawsze nielegalna. – Iwaz

+6

Jeśli to dup, dlaczego odpowiedzi są tak różne? – nobar

Odpowiedz

152
int i = 1; 
Test val = static_cast<Test>(i); 
+11

auto val = static_cast (i); // C++ 11 – Mitch

+1

@Mitch co mam zrobić, aby użyć 'auto' w tym przypadku? Czy są jakieś ulepszenia wydajności? –

+1

Brak poprawy wydajności. Ulepszenia dotyczące konserwacji. – Mitch

50
Test e = static_cast<Test>(1); 
+0

MSDN: Nie przeprowadza się sprawdzania typu run-time, aby zapewnić bezpieczeństwo konwersji (http://msdn.microsoft.com/en-us/library/c36yw7x9(v=vs.80).aspx). –

+6

MSDN: Operator static_cast może jawnie przekonwertować wartość całkowitą na typ wyliczeniowy. Jeśli wartość typu całkowego nie mieści się w zakresie wartości wyliczeniowych, wynikowa wartość wyliczenia jest niezdefiniowana. –

+1

@KirillKobelev, jeśli wartość całki może być reprezentowana przez podstawowy typ wyliczenia, a wynikowe wyliczenie musi mieć tę wartość. W przeciwnym razie wytworzona wartość wyliczeniowa będzie dowolną wartością wynikającą z zamiany wyrażenia na bazowy typ enum. Jeśli VC++ robi coś innego, to myślę, że jest niezgodny. – bames53

13

Kod

enum Test 
{ 
    A, B 
} 

int a = 1; 

Rozwiązanie

Test castEnum = (Test)a; 
+34

Dobrze jest użyć najbardziej restrykcyjnej obsady i unikać rzutów w stylu C, aby dać kompilatorowi największą szansę na wykrycie błędów."static_cast" będzie tu lepszym rzutem. –

+3

@Mike Seymour, problem polega na tym, że odlewanie statyczne nie ma w tym przypadku żadnej różnicy od C-cast. Jak i jaki błąd może wykryć? –

+7

@KirillKobelev: Problem polega na tym, że rzut w stylu C nie jest wyraźny. Może być równy 'static_cast', ale równie dobrze może być' const_cast' lub nawet gorzej, 'reinterpret_cast' lub nawet ich kombinacją. Nawet jeśli wiesz teraz, co to może się pogorszyć, przypuśćmy, że zmienisz 'a' na inny typ w późniejszym czasie, to równie dobrze może być typem zmian rzucania bez otrzymania nawet ostrzeżenia, nie chcesz tego. – KillianDS