C++11強タイプ列挙

2297 ワード

本文は多くのインターネットブログの内容を整理した後に形成して、引用内容の著作権は原始の作者の所有に帰って、学習研究の使用に限られて、いかなる商業の用途に使用してはいけません.
列挙クラス-クラスドメインと強いタイプを持つ列挙
列挙クラス(「新しい列挙」/「強いタイプの列挙」)は、主に従来のC++列挙の3つの問題を解決するために使用されます.
  • 従来のC++列挙は暗黙的にintに変換され、これはintに変換すべきでない場合にエラー
  • を引き起こす可能性がある.
  • 従来のC++列挙の各列挙値は、その役割ドメインの範囲内で表示され、名前の競合(同名の競合)
  • を招きやすい.
  • は、列挙された最下位データ型を指定することができず、コードの理解が容易でない、互換性の問題、および順方向宣言ができない可能性がある
  • .
    列挙クラス(enum)(「強いタイプの列挙」)は強いタイプであり、クラスドメインを有する.
    enum Alert { green, yellow, election, red }; //     
    enum class Color { red, blue };   //               
    //                   ,  “  ::”
    //          int
    enum class TrafficLight { red, yellow, green };
    Alert a = 7;   //    ,          ,a      
    Color c = 7;   //   ,  int Color     
    int a2 = red;           //   ,Alert      int
    //   C++98     ,   C++11    
    int a3 = Alert::red;
    int a4 = blue;            //   ,blue       
    int a5 = Color::blue; //   ,  Color int     
    Color a6 = Color::blue;   //   
    

    上記のコードで示したように、従来の列挙は通常通り動作しますが、クラス名を指定することで列挙の使用を改善し、強いタイプのクラスドメインを持つ列挙にすることができます.
    新しいクラス名を持つ列挙は、従来の列挙機能(名前付き列挙値)とクラスのいくつかの特徴(列挙値の役割ドメインがクラスドメイン内にあり、暗黙的なタイプからintに変換されない)を有するため、列挙クラス(enum class)と呼ぶ.
    列挙の最下位データ型を指定できるため、簡単な相互接続と列挙値が占めるバイトサイズを保証できます.
    enum class Color : char { red, blue }; //      (    )
    //      ,           int
    enum class TrafficLight { red, yellow, green };
    // E      ?        :        
    enum E { E1 = 1, E2 = 2, Ebig = 0xFFFFFFF0U };
    
    // C11                   
    enum EE : unsigned long { EE1 = 1, EE2 = 2, EEbig = 0xFFFFFFF0U };
    

    同時に、列挙値の最下位データ型を指定できるため、順方向宣言が可能になる.(注:列挙クラス定義の前にこの列挙クラスの名前を使用してポインタまたは参照変数を宣言する)
    enum class Color_code : char;     // (  )   
    void foobar(Color_code* p);   //   
    // ...
    //   
    enum class Color_code : char { red, yellow, green, blue };
    

    列挙クラスの最下位データ型は、シンボルまたはシンボルなしの整数でなければなりません.デフォルトではintです.
    標準ライブラリにも列挙クラスが使用されています.
  • システム固有のエラーコード、定義:enum class errc
  • ポインタ安全指示、定義:enum class pointer_safety { relaxed, preferred, strict }
  • I/Oストリームエラー、定義:enum class io_errc { stream = 1 }
  • 非同期通信エラー、定義:enum class future_errc { broken_promise, future_already_retrieved, promise_already_satisfied }

  • いくつかの列挙クラスでは、オペレータの再ロードも定義されています.たとえば、"="などです.
    参考資料
    【c++11 FAQ】列挙クラス——クラスドメインと強いタイプの列挙を持つ