C++11強タイプ列挙

3061 ワード

【C++11強タイプ列挙】
標準C++では、列挙タイプはタイプセキュリティではありません.列挙タイプは整数と見なされ、2つの異なる列挙タイプ間で比較できるようにします.C++03が唯一提供するセキュリティメカニズムは、1つの整数または1つの列挙値が暗黙的に別の列挙型に変換できないことである.また、列挙に使用される整数タイプとそのサイズは、実装方法によって定義され、明確に指定できません.最後に,列挙名の全数が一般に露出しているため,C++03の2つの異なる列挙は,同じ列挙名を持つことはできない.(例えばenum Side{Right,Left};enum Thing{Wrong,Right};と一緒に使用できません.)
C++11は,上記の問題を回避できる特別な「列挙クラス」を導入した.enum classの構文を使用して宣言します.
enum class Enumeration

{

  Val1,

  Val2,

  Val3 = 100,

  Val4 /* = 101 */,

};


この列挙はタイプが安全である.列挙タイプは暗黙的に整数に変換できない.整数値と比較することもできません.(式Enumeration::Val4 == 101はコンパイル期間エラーをトリガーすることを示す).
列挙タイプで使用されるタイプは、明示的に指定する必要があります.上記の例では、デフォルトタイプintを使用していますが、他のタイプを指定することもできます.
enum class Enum2 : unsigned int {Val1, Val2};


列挙タイプの語彙範囲(scoping)は、列挙タイプの名前範囲に定義されます.列挙タイプの列挙名を使用する場合は、その属する範囲を明確に指定する必要があります.前述の列挙タイプEnum 2を例にとると、Enum 2::Val 1は有意義な表現であり、単独のVal 1はNOである.
さらに、C++11では、従来の列挙の使用タイプを指定できます.
enum Enum3 : unsigned long {Val1 = 1, Val2};


列挙名Val 1は、Enum 3の列挙範囲(Enum 3::Val 1)に定義されていますが、互換性のため、Val 1は一般的な範囲で単独で使用できます.
C++11では、指定可能なタイプの新しい列挙を使用すれば、列挙タイプの事前宣言(forward declaration)も可能です.以前のC++が列挙の前置き宣言を書くことができなかったのは、列挙パラメータが占める空間の大きさを決定できなかったためであり、C++11はこの問題を解決した.
enum Enum1;                     //      C++   C++11;       

enum Enum2 : unsigned int;      //     C++11

enum class Enum3;               //     C++11,           int 

enum class Enum4: unsigned int; //     C++11

enum Enum2 : unsigned short;    //      C++11,Enum2       unsigned int


参照:http://zh.wikipedia.org/wiki/C++0x#.E5.BC.B7.E5.9E.8B.E5.88.A5.E5.88.97.E8.88.89