我最近一直在使用枚举,我意识到枚举,甚至枚举类,本质上是不安全的。
事实上,这样做很容易:
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 为它们引入了一个新结构,这甚至都不是向后兼容的问题。