使用类static const成员创建安全枚举

时间:2013-04-26 18:36:09

标签: c++ c++11 static enums const

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

事实上,很容易做到这样的事情:

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

0 个答案:

没有答案