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 déclaration et d'utilisation que 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.