Maison >développement back-end >C++ >Comment mapper efficacement des énumérations C à des chaînes ?

Comment mapper efficacement des énumérations C à des chaînes ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-10 01:22:12555parcourir

How to Efficiently Map C   Enums to Strings?

Comment mapper facilement des énumérations C en chaînes

Lors de l'utilisation d'énumérations définies dans les en-têtes de bibliothèques tierces, il devient nécessaire d'établir un mécanisme pour convertir les valeurs d'énumération en valeurs utilisateur -chaînes définies et vice versa.

Standard Approche

Une approche simple consiste à créer une série de fonctions :

enum MyEnum {VAL1, VAL2,VAL3};

String getStringFromEnum(MyEnum e)
{
  switch e
  {
  case VAL1: return "Value 1";
  case VAL2: return "Value 2";
  case VAL1: return "Value 3";
  default: throw Exception("Bad MyEnum");
  }
}

Cette méthode manque cependant d'élégance et ressemble à une approche de style C.

Solution basée sur un modèle

Une approche plus sophistiquée utilise templates :

std::map<MyEnum, char const*> MyMap;
//...
MyMap.insert(std::make_pair(VAL1, "Value 1"));
//...
char const* enumString = MyMap[e];

Cette méthode fournit un mécanisme de mappage propre et efficace.

map_init Helper Class

Pour des raisons de commodité syntaxique, les éléments suivants La classe d'assistance peut être utilisée :

template<typename T> struct map_init_helper
{
    map_init_helper(T&amp; d) : data(d) {}
    T&amp; data;
    map_init_helper&amp; operator() (typename T::key_type const&amp; key, typename T::mapped_type const&amp; value)
    {
        data[key] = value;
        return *this;
    }
};

template<typename T> map_init_helper<T> map_init(T&amp; item)
{
    return map_init_helper<T>(item);
}

Avec cette aide, le mappage peut être réalisé comme suit :

std::map<MyEnum, char const*> MyMap;
map_init(MyMap)
    (VAL1, "Value 1")
    (VAL2, "Value 2")
    (VAL3, "Value 3");

Cette syntaxe simplifiée élimine le besoin d'instructions d'insertion verbeuses.

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!

Déclaration:
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