C++0x - Strongly Typed Enums

現在の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 };

C++0x言語拡張まとめ