Impression de valeurs d'énumération sous forme de texte sans if/switch en C
En C, les énumérations fournissent un moyen d'attribuer des valeurs entières aux noms symboliques. Cependant, lors de l'impression d'une valeur d'énumération sur la console, elle affiche généralement l'entier associé au lieu du nom symbolique.
Pour surmonter cette limitation et imprimer les valeurs d'énumération sous forme de texte, explorons trois solutions efficaces :
1. Utilisation d'une carte :
L'utilisation d'un std::map permet une recherche efficace des valeurs d'énumération dans leurs représentations textuelles correspondantes.
#include <map> #include <string_view> enum Errors { ErrorA = 0, ErrorB, ErrorC }; // Custom insertion function for map #define INSERT_ELEMENT(p) result.emplace(p, #p); // Initialize the map static const auto strings = []() { std::map<Errors, std::string_view> result; INSERT_ELEMENT(ErrorA); INSERT_ELEMENT(ErrorB); INSERT_ELEMENT(ErrorC); return result; }; std::ostream& operator<<(std::ostream& out, const Errors value) { return out << strings[value]; }
2. Utilisation d'un tableau de structures avec recherche linéaire :
Cette approche consiste à créer un tableau de structures, chacune contenant une valeur d'énumération et son texte correspondant. La recherche linéaire est ensuite utilisée pour récupérer le texte de la valeur d'énumération souhaitée.
#include <string_view> enum Errors { ErrorA = 0, ErrorB, ErrorC }; // Structure for mapping enum to text struct MapEntry { Errors value; std::string_view str; }; std::ostream& operator<<(std::ostream& out, const Errors value) { const MapEntry entries[] = { {ErrorA, "ErrorA"}, {ErrorB, "ErrorB"}, {ErrorC, "ErrorC"} }; const char* s = nullptr; for (const MapEntry* i = entries; i->str; i++) { if (i->value == value) { s = i->str; break; } } return out << s; }
3. Utilisation de switch/case :
Bien que moins efficace que l'approche map, switch/case peut également être utilisé pour mapper des valeurs d'énumération sur du texte.
#include <string> enum Errors { ErrorA = 0, ErrorB, ErrorC }; std::ostream& operator<<(std::ostream& out, const Errors value) { return out << [value]() { switch (value) { case ErrorA: return "ErrorA"; case ErrorB: return "ErrorB"; case ErrorC: return "ErrorC"; } }; }
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!