众所周知,C ++中的内置枚举不是类型安全的。我想知道在那里使用了哪些实现类型安全枚举的类……我本人使用以下“自行车”,但是它有些冗长和有限:
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; }
用法:
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;
另外: 我认为我应该更具体地说明这些要求。我将尝试总结一下:
优先级1:毫无例外,将枚举变量设置为无效值应该是不可能的(编译时错误)。
优先级2:应该可以通过单个显式函数/方法调用将枚举值与int转换。
优先级3:尽可能紧凑,优雅,方便的声明和使用
优先级4:将枚举值与字符串进行相互转换。
优先级5 :(很高兴)迭代枚举值的可能性。
德玛西亚99
千万里不及你