Maison > développement back-end > C++ > Comment puis-je imprimer les valeurs C Enum sous forme de texte sans utiliser les instructions if/switch ?

Comment puis-je imprimer les valeurs C Enum sous forme de texte sans utiliser les instructions if/switch ?

Susan Sarandon
Libérer: 2024-11-27 19:24:15
original
535 Les gens l'ont consulté

How Can I Print C   Enum Values as Text Without Using if/switch Statements?

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];
}
Copier après la connexion

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;
}
Copier après la connexion

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";
        }
    };
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal