我最近一直在使用枚举,而且我意识到枚举,甚至枚举类本身都是不安全的。
事实上,很容易做到这样的事情:
enum class EnumType {
A,
B,
};
...
EnumType x = static_cast<EnumType>(10000);
这意味着,在接收EnumType
变量的每一段代码中,可能需要检查包含的值是什么,因为它可能超出了用户指定的值。对于一个唯一目标是创建新类型的构造来说,这似乎很奇怪。
所以我试着建立一个等价物,令我惊讶的是,这很容易做到:
class ClassType final {
public:
ClassType() = delete;
bool operator==(const ClassType & x) { return x.id == id; }
static const ClassType A;
static const ClassType B;
private:
ClassType(int x) : id(x) {}
int id;
};
const ClassType ClassType::A(0);
const ClassType ClassType::B(1);
现在每个ClassType
变量将始终包含有效值,您无法创建包含无效值的变量,并且只能在已有效值之间进行复制。创建新的有效元素也很容易,并且也很容易定义自定义操作/强制转换,这是标准枚举不能让你做的事情。我认为整个开销很小,如果这是该语言的一个特性,它可能会减少甚至更多。
问题是:为什么这些开箱即用的工作不是这样的,因为(我认为)这将是任何人期望的行为?考虑到c ++ 11为它们引入了新的构造,它甚至不是后向兼容性的问题。