0

我最近一直在使用枚举,我意识到枚举,甚至枚举类,本质上是不安全的。

事实上,这样做很容易:

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 为它们引入了一个新结构,这甚至都不是向后兼容的问题。

4

0 回答 0