Qui Typesafe Enum en C++ Utilisez-Vous?

C'est la connaissance commune que construit-dans les énumérations en C++ ne sont pas typesafe.
Je me demandais ce qui les classes de la mise en œuvre de typesafe les enums sont utilisées là-bas...
J'utilise moi-même la suite de "vélo", mais elle est un peu verbeux et limitée:

typesafeenum.h:

struct TypesafeEnum
{
//Construction:
public:
    TypesafeEnum(): id (next_id++), name("") {}
    TypesafeEnum(const std::string& n): id(next_id++), name(n) {}

//Operations:
public:
    bool operator == (const TypesafeEnum& right) const;
    bool operator != (const TypesafeEnum& right) const;
    bool operator < (const TypesafeEnum& right) const;

    std::string to_string() const { return name; }

//Implementation:
private:
    static int next_id;
    int id;
    std::string name;
};

typesafeenum.cpp:

int TypesafeEnum::next_id = 1;

bool TypesafeEnum::operator== (const TypesafeEnum& right) const 
{ return id == right.id; }

bool TypesafeEnum::operator!= (const TypesafeEnum& right) const 
{ return !operator== (right); }

bool TypesafeEnum::operator< (const TypesafeEnum& right) const  
{ return id < right.id; }

Utilisation:

class Dialog 
{
 ...
    struct Result: public TypesafeEnum
    {
        static const Result CANCEL("Cancel");
        static const Result OK("Ok");
    };


    Result doModal();
 ...
};

const Dialog::Result Dialog::Result::OK;
const Dialog::Result Dialog::Result::CANCEL;

Plus:
Je pense que j'aurais du être plus précis sur les exigences. Je vais essayer de résumer:

Priorité 1: la définition d'un enum variable à une valeur non valide doit être impossible (une erreur de compilation), sans exceptions.

Priorité 2: Conversion d'une valeur d'enum vers/à partir d'un int devrait être possible avec une seule fonction explicite/appel de la méthode.

Priorité 3: compact, élégant et pratique de la déclaration et de l'utilisation possible

Priorité 4: Convertir les valeurs de l'enum et de cordes.

Priorité 5: (optionnel) Possibilité d'effectuer une itération sur les valeurs de l'enum.

  • Désolé, ce compilateur utilisez-vous? MSVC 2008 ne peut pas compiler cet exemple. Ce - static const Résultat ANNULER("Annuler"); - ne pas ressembler à un valide le code C++...
  • Désolé pour le long retard, probablement pas pertinent, pas plus, mais je vais quand même répondre: c'était mon erreur, la version originale que j'ai eu n'ont pas de cordes, j'ai boulonné sur avant de poster sans vérifier, désolé. La version correcte serait de passer des chaînes à la les valeurs de l'enum' constructeurs dans le fichier cpp.
  • c'est actuellement la meilleure question sur les énumérations et les chaînes de caractères dans la sofar.
  • J'ai changé les balises de c++03, comme il est expressément tapé les énumérations sont maintenant une partie de C++. Notez que les énumérations où déjà "typesafe" en C++2003.
InformationsquelleAutor Alex Jenter | 2008-10-20