Apakah ada cara untuk memeriksa C ++ 11 jika enum kontinu ?
Ini sepenuhnya valid untuk memberikan nilai enum yang bukan. Apakah mungkin ada fitur seperti jenis sifat di C ++ 14, C ++ 17 atau mungkin C ++ 20 untuk memeriksa apakah enum kontinu? Ini untuk digunakan dalam static_assert.
Contoh kecil berikut:
enum class Types_Discontinuous {
A = 10,
B = 1,
C = 100
};
enum class Types_Continuous {
A = 0,
B = 1,
C = 2
};
static_assert(SOME_TEST<Types_Discontinuous>::value, "Enum should be continuous"); // Fails
static_assert(SOME_TEST<Types_Continuous>::value, "Enum should be continuous"); // Passes
enum
. Sayangnya saya memiliki pekerjaan harian sehingga tidak dapat mencoba untuk menulis ini, walaupun saya akan menjawab dengan suara keras berdasarkan pendekatan ini. Saya cukup yakin seseorang seperti @barry atau @sehe bisa melakukannya.static_assert
)? Bahkan jika Anda tidak dapat membuat "solusi yang indah", tolong tetap tuliskan jawaban karena saya sangat ingin tahu bagaimana hal itu dapat dilakukan dengan cara yang umum.Jawaban:
Untuk beberapa
enum
s Anda mungkin bisa meretas jalan Anda melalui ini menggunakan perpustakaan Magic Enum . Sebagai contoh:Perhatikan bahwa ini memang, seperti namanya perpustakaan, "ajaib" - pustaka berfungsi pada sejumlah peretas khusus kompiler. Karena itu tidak benar-benar memenuhi persyaratan Anda "pure C ++", tetapi mungkin sebaik yang kami bisa dapatkan sampai kami memiliki fasilitas refleksi dalam bahasa tersebut.
sumber
Ini tidak mungkin dalam C ++ murni, karena tidak ada cara untuk menyebutkan nilai enum, atau menemukan jumlah nilai dan nilai minimum dan maksimum. Tetapi Anda dapat mencoba menggunakan bantuan kompiler Anda untuk mengimplementasikan sesuatu yang mendekati apa yang Anda inginkan. Sebagai contoh, di gcc dimungkinkan untuk menegakkan kesalahan kompilasi jika
switch
pernyataan tidak menangani semua nilai enum:Jelas, ini khusus untuk enum yang diberikan, tetapi definisi fungsi tersebut dapat diotomatisasi dengan preprosesor.
sumber
Saya ingin melihat jawabannya. Saya membutuhkannya juga.
Sayangnya, saya tidak berpikir ini mungkin menggunakan utilitas yang ada. Jika Anda ingin menerapkan sifat jenis ini, Anda memerlukan dukungan dari kompiler Anda, jadi menulis templat untuk itu kedengarannya tidak layak.
Saya sudah memperpanjang enumerasi dengan tag tertentu untuk menunjukkan bahwa itu bersebelahan dan segera memberi Anda ukuran: enum class constructor c ++, bagaimana cara memberikan nilai spesifik?
Atau, Anda dapat menulis sifat Anda sendiri:
Ini perlu dikhususkan setiap kali Anda mendefinisikan enum yang berdekatan di mana Anda ingin menggunakan ini. Sayangnya, ini membutuhkan beberapa pemeliharaan dan perhatian jika enum diubah.
sumber
Semua enum bersifat kontinu. 0 selalu diizinkan; nilai tertinggi yang diizinkan adalah enumerator tertinggi yang dibulatkan ke yang berikutnya
1<<N -1
(semua bit satu), dan semua nilai di antaranya diizinkan juga. ([dcl.enum] 9.7.1 / 5). Jika ada enumerator negatif yang ditentukan, nilai terendah yang diizinkan juga didefinisikan dengan membulatkan ke bawah enumerator terendah.Enumerator yang didefinisikan dalam
enum
adalah ekspresi konstan dengan nilai dalam rentang dan tipe yang benar, tetapi Anda dapat menentukan konstanta tambahan di luarenum
yang memiliki properti yang sama:constexpr enum class Types_Discontinuous = static_cast<Types_Discontinuous>(2)
sumber