C ++ enum için int nasıl kullanılır?


222

Nasıl bir int C ++ bir numaralandırma için döküm?

Örneğin:

enum Test
{
    A, B
};

int a = 1;

Nasıl atüre dönüştürebilirim Test::A?


1
link int'nin enum türünün sabitlerinden biriyle eşleşip eşleşmediğinin önemli olmadığını unutmayın; tür dönüşümü her zaman yasa dışıdır.
Iwaz

3
Test :: A'ya döküm yapmak istiyorsanız, değerinin int a0 olması gerektiğine inanıyorum çünkü Test :: A'nın örtük değeri 0 ve Test :: B'nin örtük değeri 1'dir. özellikle Test :: A, noktanın yanı sıra ...
JohnRDOrazio

Yanıtlar:


243
int i = 1;
Test val = static_cast<Test>(i);

21
otomatik val = statik_ yayın <Test> (i); // C ++ 11
Mitch

3
@Mitch autoBu durumda ne için kullanırım ? Performans iyileştirmeleri var mı?
Frederico Pantuzza

2
Performans iyileştirmesi yok. "Auto" ile belirtirseniz, derleyici türü otomatik olarak çıkarır. Gelecekte enum adınızı değiştirmeye karar verirseniz, derleyici otomatik olarak doğru tür adını çıkaracağından kodunuzu daha az değiştireceksiniz.
Aydin Özcan

74
Test e = static_cast<Test>(1);

10
MSDN: static_cast operatörü bir integral değerini açıkça numaralandırma türüne dönüştürebilir. İntegral tipin değeri numaralandırma değerleri aralığı içine düşmezse, sonuçta ortaya çıkan numaralandırma değeri tanımsız olur.
Kirill Kobelev

1
@KirillKobelev integral değer enumun altta yatan türü ile temsil edilebiliyorsa, ortaya çıkan enum bu değere sahip olmalıdır. Aksi takdirde, üretilen numaralandırma değeri, ifadenin numaralandırmanın temel türüne dönüştürülmesinden kaynaklanan değer olacaktır. VC ++ farklı bir şey yaparsa o zaman uygun olmadığını düşünüyorum.
bames53

2
enum {1,3,5} değerlerine sahipse ve kod 2 değerinden <static_cast> yapmaya çalışırsa, uygun bir derleyici ne yapmalıdır? Bu, C-dökümünden nasıl farklı olacaktır?
Kirill Kobelev

6
@KirillKobelev C stili dökümden farklı bir şey yaptığı için static_cast kullanmıyorum, C ++ dökümleri stilsel olarak C dökümlerine tercih edildiği için static_cast kullanıyorum.
bames53

4
@KirillKobelev " enum {1,3,5} değerlerine sahipse " Hayır. Numaralandırma türü yalnızca şu 3 olası değerle sınırlandırılamaz: {1,3,5} numaralandırmadır (numaralandırma değerleri olarak adlandırılır), numaralandırmanın kendisi değil . 1,3,5 olası numaralandırma değerleri varsa, o zaman 2'dir.
curiousguy

25

Senin kodun

enum Test
{
    A, B
}

int a = 1;

Çözüm

Test castEnum = static_cast<Test>(a);

45
Derleyiciye hataları tespit etmek için en iyi şansı vermek için, yapabileceğiniz en kısıtlayıcı kadroyu kullanmak ve C tarzı dökümlerden tamamen kaçınmak iyi bir fikirdir. static_castburada daha iyi bir oyuncu olur.
Mike Seymour

4
@Mike Seymour, sorun, bu durumda statik dökümün C dökümünden hiçbir farkı olmaması. Nasıl ve ne hata tespit edebilir ???
Kirill Kobelev

7
@KirillKobelev: Sorun, C stili bir oyuncu kadrosunun açık olmaması. Bu, a'ya eşit static_castolabilir, ancak bunların bir const_castveya daha kötü, bir reinterpret_castveya hatta bir kombinasyonu da olabilir. Şimdi neyin bozunacağını biliyor olsanız bile, adaha sonra başka bir türe geçtiğinizi varsayalım , bir uyarı kadar almadan döküm değişikliklerinin türü olabilir, bunu istemezsiniz.
KillianDS

4
@KillianDS "a'yı daha sonra başka bir türle değiştirdiğinizi varsayalım "
curiousguy

2
Evet, ya bunlar ya da varsa örtük bir oyuncu kadrosu. Oyuncunun amacının ne olduğu çok daha açık.
KillianDS

8

Kapanış sorusunu çevirmek , orada Test::Abir oyuncuya sahip olma gereksinimi hakkında katı olmak yerine "nasıl bir tipe dönüştürebilirim " ve birkaç yıl geç cevap vermek, bu kimsenin alternatiften bahsetmediği popüler bir soru gibi görünüyor , C ++ 11 standardına göre:

5.2.9 Statik döküm

... bir ifade e, icat edilen bazı geçici değişkenler (8.5) için iyi biçimlendirilmişse, formdan birisini T kullanarak bir türe açık bir şekilde dönüştürülebilir . Bu tür açık bir dönüşümün etkisi, bildirimi ve başlatmayı gerçekleştirmek ve daha sonra dönüşümün sonucu olarak geçici değişkeni kullanmakla aynıdır.static_caststatic_cast<T>(e)T t(e);t

Bu nedenle, formu doğrudan kullanmak t(e)da işe yarayacaktır ve düzgünlük için tercih edebilirsiniz:

auto result = Test(a);

bu çözüm derleyici seçeneğinin static_cast <> (anlamsal denetim) öğesini engellemesi durumunda çalıştı. Benim için mantıklı değil, ama yine de temiz.
Buisson

1

Test castEnum = static_cast<Test>(a-1);Altyapı 1'i istemiyorsanız, yeniden tanımlayabilirsiniz enum:

enum Test
{
    A:1, B
};

Bu durumda `` cast castEnum = static_cast (a); '' a'ya A dökmek için kullanılabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.