のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

C++11 Enum Class

Sponsored Links

皆さんこんにちは
お元気ですか。私は元気です。

さて、今日はC++11にあるEnum Classについて解説したいと思います。

enum class Number{
	ONE,
	TWO,
	THREE,
	FOUR
};

C++にて実装されているenumと比較して classを入れることで実現ができていますね。
使い方はほぼ同じなのですが、一部異なることがあります。

一つは型が厳密になりました。
どういうことかといいますと従来までのenumではこのような書き方が出来ました。

enum number{
	N1_ONE,
	N1_TWO,
	N1_THREE,
	N1_FOUR
};

enum number2{
	N2_ONE,
	N2_TWO,
	N2_THREE,
	N2_FOUR
};

//整数型の比較となるので、コンパイルエラーとならない
if(N1_ONE == N2_ONE){
	cout << "等しい" << endl;
}else{
	cout << "等しくない" << endl;
}

これはどんな問題を引き起こすのかといいますと、プログラマが意図しない比較をさせる可能性があることです。
enumで列挙していることに意味があるはずなのにそれを無視した記載となっています。

今度は同じことをenum classで実現します。

enum class Number{
	ONE,
	TWO,
	THREE,
	FOUR
};

enum class Number2{
	N2_C_ONE,
	N2_C_TWO,
	N2_C_THREE,
	N2_C_FOUR
};

//コンパイルエラー
if(Number::ONE == Number2::ONE){
	cout << "等しい" << endl;
}else{
	cout << "等しくない" << endl;
}

こちらは比較できません。クラスが違うので、コンパイル時に警告を発します。

因みに代入も異なります。

int a = N1_FOUR;
int b = Number::ONE; //コンパイルが通る
int c  = static_cast<int>(Number::ONE); //無理矢理ですが通ります。

因みにコンパイルするときMac上では -std=c++11のオプションが必要です。
一体clangはどういう解釈をしているんだ!?-std=c++11の基準とはなんだったのか。

参考文献

C++11 - Wikipedia