Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mencetak Nilai C Enum sebagai Teks Tanpa Menggunakan Pernyataan 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.
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!