Apakah ada cara untuk mengonversi enum class
bidang menjadi tipe yang mendasari? Saya pikir ini akan otomatis, tetapi ternyata tidak.
enum class my_fields : unsigned { field = 1 };
unsigned a = my_fields::field;
Tugas itu ditolak oleh GCC. error: cannot convert 'my_fields' to 'unsigned int' in assignment
.
enum
.[C++11: 7.2/9]
.Jawaban:
Saya pikir Anda dapat menggunakan std :: underlying_type untuk mengetahui tipe yang mendasarinya, dan kemudian menggunakan cast:
Dengan ini, Anda tidak perlu mengasumsikan tipe yang mendasari, atau Anda tidak perlu menyebutkannya dalam definisi
enum class
sukaenum class my_fields : int { .... }
atau lebih.Anda bahkan dapat menulis fungsi konversi umum yang seharusnya dapat mengonversi apa pun
enum class
menjadi tipe integral yang mendasarinya :lalu gunakan itu:
Dan karena fungsinya dideklarasikan
constexpr
, Anda dapat menggunakannya di mana ekspresi konstan diperlukan:sumber
template <typename T> auto to_integral(T e) { return static_cast<std::underlying_type_t<T>>(e); }
constexpr
juga di masa depan; sebenarnya jauh lebih kuat dari apa yang saya miliki di 2013: P)Anda tidak dapat mengubahnya secara implisit , tetapi cast eksplisit dimungkinkan:
Juga perhatikan fakta, bahwa titik koma harus setelah kurung kurawal tertutup dalam definisi enum Anda, bukan sebelumnya.
sumber
Saya menemukan fungsi berikut
underlying_cast
berguna ketika harus menyusun nilai enum dengan benar.sumber
Seperti yang ditunjukkan orang lain, tidak ada pemeran implisit, tetapi Anda dapat menggunakan pemeran eksplisit
static_cast
. Saya menggunakan fungsi pembantu berikut dalam kode saya untuk mengonversi ke dan dari tipe enum dan kelas yang mendasarinya.Kode penggunaan
sumber