Saya memiliki kelas enum dengan dua nilai, dan saya ingin membuat metode yang menerima nilai dan mengembalikan yang lainnya. Saya juga ingin menjaga keamanan tipe (itu sebabnya saya menggunakan kelas enum bukan enum).
http://www.cplusplus.com/doc/tutorial/other_data_types/ tidak menyebutkan apa pun tentang metode Namun, saya mendapat kesan bahwa semua jenis kelas dapat memiliki metode.
enum class/struct
dikonfirmasi?Jawaban:
Tidak, mereka tidak bisa.
Saya dapat memahami bahwa
enum class
bagian untuk enums yang sangat diketik dalam C ++ 11 mungkin tampak menyiratkan bahwa Andaenum
memilikiclass
sifat juga, tetapi bukan itu masalahnya. Dugaan saya yang berpendidikan adalah bahwa pilihan kata kunci terinspirasi oleh pola yang kami gunakan sebelum C ++ 11 untuk mendapatkan cakupan enum:Namun, itu hanya sintaks. Sekali lagi,
enum class
bukan aclass
.sumber
union
bukan apa yang John Doe akan anggap sebagai kelas juga. Namun mereka dapat memiliki fungsi anggota. Dan kelas benar-benar tidak wajib untuk fungsi anggota. Menggunakan penunjuk sukavalue
atauthis
, sesuatu sepertienum Size { Huge, Mega, Apocalypse; bool operator<(X rhs) const { return *this < rhs; }
(di sini juga memungkinkan;
), itu bisa masuk akal seperti bentuk-bentuk fungsi lainnya.Sementara jawaban yang "Anda tidak bisa" secara teknis benar, saya percaya Anda mungkin dapat mencapai perilaku yang Anda cari menggunakan ide berikut:
Saya membayangkan Anda ingin menulis sesuatu seperti:
Dan Anda berharap kode tersebut terlihat seperti ini:
Tetapi tentu saja, itu tidak berhasil, karena enum tidak dapat memiliki metode (dan 'ini' tidak berarti apa-apa dalam konteks di atas)
Namun, jika Anda menggunakan gagasan kelas normal yang berisi enum non-kelas dan variabel anggota tunggal yang berisi nilai jenis itu, Anda bisa sangat dekat dengan keamanan sintaksis / perilaku / tipe yang Anda inginkan. yaitu:
Sekarang Anda dapat menulis:
Dan kompiler akan mencegah hal-hal seperti:
Anda dapat dengan mudah menambahkan metode sedemikian rupa sehingga:
dan
dapat didukung.
sumber
Berkonsentrasi pada deskripsi pertanyaan dan bukan judul jawaban yang mungkin
sumber
Seperti disebutkan dalam jawaban lain , tidak. Bahkan
enum class
bukan kelas.Biasanya kebutuhan untuk memiliki metode untuk
enum
hasil dari alasan itu bukan enum biasa (hanya incrementing), tetapi jenis definisi nilai bitwise untuk disembunyikan atau memerlukan operasi bit-aritmatika lainnya:Jelas orang berpikir untuk merangkum operasi yang diperlukan untuk mengatur ulang / menetapkan bit tunggal / kelompok, dengan nilai bit mask misalnya atau bahkan operasi berbasis indeks bit akan berguna untuk memanipulasi set seperti 'flags'.
Itu c ++ 11
struct
/class
Spesifikasi hanya mendukung pelingkupan yang lebih baik dari nilai enum untuk akses. Tidak lebih, tidak kurang!Cara untuk keluar dari batasan Anda tidak dapat mendeklarasikan metode untuk enum (kelas) adalah, baik menggunakan
std::bitset
(kelas pembungkus), atau bitfieldunion
.union
s, dan serikat bitfield semacam itu dapat memiliki metode (lihat di sini untuk pembatasan!).Saya punya sampel, bagaimana mengkonversi nilai bit mask (seperti yang ditunjukkan di atas) ke indeks bit yang sesuai, yang dapat digunakan di
std::bitset
sini: BitIndexConverter.hppSaya telah menemukan ini cukup berguna untuk meningkatkan keterbacaan dari beberapa keputusan berdasarkan 'flag' algoritma.
sumber
Ada kemampuan yang cukup kompatibel (§) untuk membuat ulang enum ke dalam kelas tanpa harus menulis ulang kode Anda, yang berarti bahwa secara efektif Anda dapat melakukan apa yang Anda minta tanpa terlalu banyak mengedit.
(§) seperti yang ditunjukkan ElementW dalam komentar, kode dependen type_traits tidak akan berfungsi, jadi misalnya seseorang tidak dapat menggunakan otomatis, dll. Mungkin ada beberapa cara untuk menangani hal-hal seperti itu, tetapi pada akhirnya seseorang mengubah enum menjadi sebuah kelas, dan selalu merupakan kesalahan untuk menumbangkan C ++
yang
enum struct
danenum class
spesifikasi tentang scoping sehingga bukan bagian dari ini.Enum orisinal Anda adalah misalnya 'hewan peliharaan' (ini hanya sebagai contoh!).
(1) Anda memodifikasinya menjadi misalnya petEnum (untuk menyembunyikannya dari kode yang ada)
(2) Anda menambahkan deklarasi kelas baru di bawahnya (dinamai dengan enum asli)
(3) Sekarang Anda dapat menambahkan metode kelas apa pun yang Anda suka ke kelas hewan peliharaan Anda. misalnya. operator string
Sekarang Anda dapat menggunakan mis std :: cout ...
sumber
pet
ketik / contoh, apakah itu templatauto
,, ataudecltype
, ini rusak, karena Anda mendapatkanpetEnum
sebaliknya.Ini mungkin tidak memenuhi semua kebutuhan Anda, tetapi dengan operator non-anggota Anda masih bisa bersenang-senang. Sebagai contoh:
Ini memungkinkan kode seperti
sumber