Mengambil Nilai Enum sebagai Teks dalam C
Dalam C , tingkah laku lalai untuk mencetak enum adalah untuk mengeluarkan nilai berangkanya. Walau bagaimanapun, terdapat situasi di mana adalah wajar untuk mendapatkan semula perwakilan teks bagi nilai enum.
Penyelesaian Tanpa jika/suis:
Menggunakan Peta:
#include <map> #include <string_view> enum Errors { ErrorA = 0, ErrorB, ErrorC }; 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]; }
Menggunakan Tatasusunan dengan Linear Carian:
#include <string_view> enum Errors { ErrorA = 0, ErrorB, ErrorC }; 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} // Placeholder for default case }; #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; }
Menggunakan Suis/Pernyataan Kes:
#include <string> enum Errors { ErrorA = 0, ErrorB, ErrorC }; 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 }(); }
Kes Ujian:
#include <iostream> int main() { std::cout << ErrorA << std::endl << ErrorB << std::endl << ErrorC; return 0; }
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Nilai Enum sebagai Teks dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!