


Bagaimana untuk Mencetak Nilai C Enum sebagai Teks Tanpa Menggunakan Pernyataan if/switch?
Nov 29, 2024 pm 10:55 PMMencetak Nilai Enum sebagai Teks dalam C Tanpa if/switch
Dalam C , enum menyediakan cara yang mudah untuk mewakili set pemalar bernama. Walau bagaimanapun, apabila mencetak nilai enum, tingkah laku lalai adalah untuk memaparkan perwakilan berangkanya.
Andaikan kita mempunyai enum seperti ini:
enum Errors { ErrorA = 0, ErrorB, ErrorC, };
Jika kita cuba mencetak nilai enum menggunakan std::cout:
Errors anError = ErrorA; std::cout << anError; // 0 will be printed
Kami akan mendapat nilai angka 0 dan bukannya perwakilan teks "ErrorA". Isu ini timbul kerana std::cout tidak mempunyai sokongan terbina dalam untuk menukar enum kepada rentetan.
Penyelesaian
1. Menggunakan Peta
Satu pendekatan ialah mencipta peta yang mengaitkan setiap nilai enum dengan perwakilan teksnya:
#include <map> #include <string_view> std::ostream& operator<<(std::ostream& out, const Errors value) { static const auto strings = [] { std::map<Errors, std::string_view> result; #define INSERT_ELEMENT(p) result.emplace(p, #p); INSERT_ELEMENT(ErrorA); INSERT_ELEMENT(ErrorB); INSERT_ELEMENT(ErrorC); #undef INSERT_ELEMENT return result; }; return out << strings[value]; }
2. Menggunakan Tatasusunan Struktur dengan Carian Linear
Pilihan lain ialah menggunakan tatasusunan struktur, setiap satu mengandungi nilai enum dan perwakilan teksnya, dan kemudian lakukan carian linear:
#include <string_view> std::ostream& operator<<(std::ostream& out, const Errors value) { #define MAPENTRY(p) {p, #p} const struct MapEntry { Errors value; std::string_view str; } entries[] = { MAPENTRY(ErrorA), MAPENTRY(ErrorB), MAPENTRY(ErrorC), {ErrorA, 0} //doesn't matter what is used instead of ErrorA here... }; #undef MAPENTRY const char* s = 0; for (const MapEntry* i = entries; i->str; i++) { if (i->value == value) { s = i->str; break; } } return out << s; }
3. Menggunakan suis/kes
Akhir sekali, kita juga boleh menggunakan pernyataan suis/kes:
#include <string> std::ostream& operator<<(std::ostream& out, const Errors value) { return out << [value] { #define PROCESS_VAL(p) case(p): return #p; switch(value) { PROCESS_VAL(ErrorA); PROCESS_VAL(ErrorB); PROCESS_VAL(ErrorC); } #undef PROCESS_VAL }; }
Menguji Penyelesaian:
Untuk menguji penyelesaian ini, kita boleh mencipta boleh laku menggunakan kod berikut:
#include <iostream> int main(int argc, char** argv) { std::cout << ErrorA << std::endl << ErrorB << std::endl << ErrorC << std::endl; return 0; }
Menjalankan ini boleh laku hendaklah mengeluarkan perwakilan teks bagi nilai enum:
ErrorA ErrorB ErrorC
Atas ialah kandungan terperinci Bagaimana untuk Mencetak Nilai C Enum sebagai Teks Tanpa Menggunakan Pernyataan if/switch?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Artikel Panas

Alat panas Tag

Artikel Panas

Tag artikel panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Langkah Format Fungsi Fungsi C Langkah Penukaran Kes

Apakah jenis nilai yang dikembalikan oleh fungsi bahasa C? Apa yang menentukan nilai pulangan?

Gulc: Perpustakaan C dibina dari awal

Apakah definisi dan peraturan panggilan fungsi bahasa C dan apakah itu

Bagaimana Perpustakaan Templat St Standard (STL) berfungsi?

Penggunaan dan perkongsian frasa yang berbeza

Di manakah nilai pulangan fungsi bahasa C yang disimpan dalam ingatan?

Bagaimanakah saya menggunakan algoritma dari STL (jenis, mencari, mengubah, dll) dengan cekap?
