現在のenumはいろいろと問題がある
・型安全性
enum Color { ClrRed, ClrBlue, ClrYellow, ClrGreen, ClrBlack }; enum Alert { AltGreen, AltYello, AltRed }; bool is_danger(Alert alert) { return alert == ClrRed; // OK...他のenum値と比較できてしまう }
・スコープ
enum Color { Red }; enum Alert { Red }; // エラー!
他にも、暗黙のキャストができてしまう等・・・
C++0xからは「enum class/enum struct」とすることで
上記の問題を解決した新しいenumを提供する
enum class E { Val1, Val2, Val3 = 100, Val4/* = 101*/ }; voif f(E e) { if (e >= 100) // エラー!Eからintに変換できません ...; } int i = E::Val2; // エラー!Eからintに変換できません
enum classと書いてもenum structと書いても、どっちも同じ意味だそうです
また、enum classで定義される値はデフォルトでint型だが、これを以下のようにして変更できる
enum class E : unsigned int { Val1, Val2 };
enumも同様のことができるようになる
enum E : unsigned long { Val1, Val2 };