#include <iostream>
struct a {
enum LOCAL_A { A1, A2 };
};
enum class b { B1, B2 };
int foo(int input) { return input; }
int main(void) {
std::cout << foo(a::A1) << std::endl;
std::cout << foo(static_cast<int>(b::B2)) << std::endl;
}
Inilah a::LOCAL_A
yang coba dicapai oleh enum yang diketik dengan kuat, tetapi ada perbedaan kecil: enum yang normal dapat dikonversi menjadi tipe bilangan bulat, sedangkan enum yang diketik sangat tidak dapat melakukannya tanpa gips.
Jadi, apakah ada cara untuk mengubah nilai enum yang sangat diketik menjadi tipe integer tanpa gips? Jika ya, bagaimana?
sumber
Seperti yang orang lain katakan, Anda tidak dapat memiliki konversi tersirat, dan itu adalah desain-samping.
Jika mau, Anda dapat menghindari kebutuhan untuk menentukan jenis yang mendasari pemain.
sumber
Versi C ++ 14 dari jawaban yang diberikan oleh R. Martinho Fernandes adalah:
Seperti dengan jawaban sebelumnya, ini akan bekerja dengan segala jenis enum dan tipe yang mendasarinya. Saya telah menambahkan
noexcept
kata kunci karena tidak akan pernah membuang pengecualian.Pembaruan
Ini juga muncul di C ++ Modern Efektif oleh Scott Meyers . Lihat item 10 (itu dirinci di halaman akhir item dalam salinan buku saya).
sumber
sumber
Tidak. Tidak ada cara alami .
Bahkan, salah satu motivasi di balik mengetik sangat kuat
enum class
di C ++ 11 adalah untuk mencegah konversi diam merekaint
.sumber
Alasan tidak adanya konversi implisit (dengan desain) diberikan dalam jawaban lain.
Saya pribadi menggunakan unary
operator+
untuk konversi dari kelas enum ke tipe dasarnya:Yang memberi sedikit "pengetikan overhead":
Di mana saya benar-benar menggunakan makro untuk membuat enum dan fungsi operator dalam satu kesempatan.
sumber
Semoga ini bisa membantu Anda atau orang lain
sumber
un.i
itu adalah "anggota aktif" dan Anda hanya dapat membaca anggota aktif serikat.static_cast
.Jawaban singkatnya adalah Anda tidak bisa seperti yang ditunjukkan tulisan di atas. Tetapi untuk kasus saya, saya tidak ingin mengacaukan namespace tetapi masih memiliki konversi implisit, jadi saya hanya melakukannya:
Jenis namespacing menambahkan lapisan keamanan tipe sementara saya tidak harus statis melemparkan nilai enum apa pun ke tipe yang mendasarinya.
sumber
Foo::Foo
. Anggota dapat diakses sebagaimanaFoo::bar
danFoo::baz
dan dapat secara tidak langsung dicor (dan tidak banyak jenis keamanan). Mungkin lebih baik untuk hampir selalu menggunakan kelas enum terutama jika memulai proyek baru.Ini tampaknya tidak mungkin dengan yang asli
enum class
, tetapi mungkin Anda dapat mengejekenum class
denganclass
:Pada kasus ini,
akan setara dengan:
Ini sebagian besar setara dengan aslinya
enum class
. Anda dapat langsung kembalib::B1
dalam suatu fungsi dengan tipe pengembalianb
. Anda bisa melakukannyaswitch case
, dll.Dan dalam semangat contoh ini Anda dapat menggunakan template (mungkin bersama-sama dengan hal-hal lain) untuk menggeneralisasi dan mengolok-olok objek yang mungkin ditentukan oleh
enum class
sintaksis.sumber
Seperti yang banyak dikatakan, tidak ada cara untuk secara otomatis mengkonversi tanpa menambahkan biaya overhead dan terlalu banyak kerumitan, tetapi Anda dapat mengurangi mengetik sedikit dan membuatnya terlihat lebih baik dengan menggunakan lambdas jika beberapa pemain akan digunakan sedikit banyak dalam skenario. Itu akan menambahkan sedikit fungsi panggilan overhead, tetapi akan membuat kode lebih mudah dibaca dibandingkan dengan string static_cast yang panjang seperti yang dapat dilihat di bawah ini. Ini mungkin bukan proyek yang berguna luas, tetapi hanya kelas lebar.
sumber
Komite C ++ mengambil satu langkah ke depan (pelingkupan enums keluar dari namespace global) dan lima puluh langkah mundur (tidak ada peluruhan tipe enum untuk integer). Sayangnya,
enum class
tidak bisa digunakan jika Anda membutuhkan nilai enum dengan cara non-simbolik.Solusi terbaik adalah tidak menggunakannya sama sekali, dan sebaliknya enum diri Anda menggunakan namespace atau struct. Untuk tujuan ini, mereka dapat dipertukarkan. Anda perlu mengetikkan sedikit ekstra saat merujuk pada tipe enum itu sendiri, tetapi itu kemungkinan tidak akan sering.
sumber