Récupération des valeurs d'énumération sous forme de texte en C
En C , le comportement par défaut pour l'impression des énumérations est d'afficher leurs valeurs numériques. Cependant, il existe des situations dans lesquelles il est souhaitable de récupérer la représentation textuelle d'une valeur d'énumération.
Solutions sans if/switch :
Utilisation d'une carte :
#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]; }
Utilisation d'un tableau avec linéaire Recherche :
#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; }
Utilisation d'une instruction Switch/Case :
#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 }(); }
Cas de test :
#include <iostream> int main() { std::cout << ErrorA << std::endl << ErrorB << std::endl << ErrorC; return 0; }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!