Maison > développement back-end > C++ > Comment puis-je imprimer les valeurs C Enum sous forme de texte lisible par l'homme sans utiliser les instructions Switch/If ?

Comment puis-je imprimer les valeurs C Enum sous forme de texte lisible par l'homme sans utiliser les instructions Switch/If ?

Susan Sarandon
Libérer: 2024-11-29 22:08:13
original
983 Les gens l'ont consulté

How Can I Print C   Enum Values as Human-Readable Text Without Using Switch/If Statements?

C : Impression de valeurs d'énumération au format texte

Dans le domaine de la programmation, les énumérations (énumérations) sont souvent utilisées pour attribuer des valeurs numériques à États ou catégories distincts. Cependant, lorsqu'il s'agit d'énumérations, il devient nécessaire de transmettre leurs valeurs dans un format textuel plus significatif pour une meilleure lisibilité et compréhension.

Le problème : traduire les valeurs d'énumération en texte

Considérons une énumération définie comme suit :

enum Errors {
    ErrorA = 0,
    ErrorB,
    ErrorC,
};
Copier après la connexion

Maintenant, essayons d'imprimer la valeur d'une énumération variable :

Errors anError = ErrorA;
std::cout << anError; // Will print "0" instead of "ErrorA"
Copier après la connexion

Le défi ici réside dans la conversion de la valeur numérique de l'énumération en sa représentation textuelle correspondante.

Solutions sans utiliser Switch/If

1. Utilisation d'une carte :

Une approche consiste à utiliser une carte pour établir une correspondance entre les valeurs d'énumération et leurs représentations textuelles :

#include <map>
#include <string_view>

// Create a map that associates enum values with string views
std::map<Errors, std::string_view> errorTextMap = {
    {ErrorA, "ErrorA"},
    {ErrorB, "ErrorB"},
    {ErrorC, "ErrorC"},
};

// Overload the << operator to handle enum values
std::ostream&amp; operator<<(std::ostream&amp; out, const Errors value) {
    return out << errorTextMap[value];
}
Copier après la connexion

2. Utilisation d'un tableau de structures avec recherche linéaire :

Une solution alternative consiste à créer un tableau de structures :

#include <string_view>

// Define a structure to store enum values and text representations
struct MapEntry {
    Errors value;
    std::string_view str;
};

// Create an array of structures containing the mapping
const MapEntry errorTextEntries[] = {
    {ErrorA, "ErrorA"},
    {ErrorB, "ErrorB"},
    {ErrorC, "ErrorC"},
    {ErrorA, 0} // Dummy entry to terminate the search
};

// Overload the << operator to handle enum values
std::ostream&amp; operator<<(std::ostream&amp; out, const Errors value) {
    const char* s = nullptr;
    for (const MapEntry* i = errorTextEntries; i->str; i++) {
        if (i->value == value) {
            s = i->str;
            break;
        }
    }

    return out << s;
}
Copier après la connexion

Tester les solutions :

Pour démontrer la fonctionnalité du proposé solutions :

#include <iostream>

int main() {
    std::cout << ErrorA << std::endl;
    std::cout << ErrorB << std::endl;
    std::cout << ErrorC << std::endl;

    return 0;
}
Copier après la connexion

Sortie :

ErrorA
ErrorB
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