私は最近列挙型を使用していますが、列挙型は、たとえ列挙型クラスであっても、本質的に安全ではないことに気付きました。
実際、次のようなことを行うのは簡単です。
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 が新しい構造を導入したことを考えると、下位互換性の問題でさえありません。