C++11 で 1 行も書いたことがなく、現時点では C++11 でプログラミングする機会がない人のために、短いパラグラフで教えてください。
「列挙型クラス」とは何ですか? なぜ必要なのですか?
C++11 で 1 行も書いたことがなく、現時点では C++11 でプログラミングする機会がない人のために、短いパラグラフで教えてください。
「列挙型クラス」とは何ですか? なぜ必要なのですか?
enum class
スコープ列挙と呼ばれます。列挙子の名前で列挙が表示される名前空間を汚染するのを防ぎます。
C++03 では、enum
内部に専用の を配置することで、同じことを効果的に行うことができますclass
。おそらくそれが構文のソースであり、少し混乱しています。
int
もう 1 つの違いは、そのような型の列挙子は暗黙的に(static_cast<int>
が必要です)に変換されないことです。これが必要になることはめったにありませんが、int
引数を取る関数を 1 つの型を取ることで安全にオーバーロードできますenum
。int
が誤って呼び出されることはありません。または、専用の関数を使用して疑似整数型を定義operator
し、組み込み演算子が干渉しないようにすることもできます。
これらの 2 つの無関係な違いが同じパッケージに含まれていること、および暗黙的な変換なしでスコープ外の列挙を取得できないことは少し面倒ですが、一般的に両方の変更は良いことでenum class
あり、C++11 の優れたデフォルト プラクティスです。
編集:スコープ付き列挙は次のように定義されます:
enum class duck { huey, dewey, louie };
::
次のようにスコープ解決演算子と一緒に使用する必要があります。
duck culprit = duck::huey; // or "auto culprit" to avoid redundancy
この::
演算子は C++03 の範囲指定されていない列挙型でも機能するため、最初の行が欠落していても上記の 2 行目は機能することに注意してくださいclass
。
これは過度の詳細かもしれませんが、次のように列挙型を前方宣言する場合は、精緻化型指定子class
には入りません。
void quack( enum duck whom ); // not "enum class"
ただし、C++11 にはopaque-enum-declarationclass
という新しい構造があり、これにはキーワードが含まれ、完全な型が定義されます。
enum duck; // duck is declared as incomplete type
enum class duck; // duck is now complete type; underlying type defaults to int
キーワードは、意味上の違いなしstruct
で置き換えることができます。class
ポイント 1 に関連して、enum
s のストレージ サイズは、列挙型に割り当てられた最大値に応じて C++11 より前に変更されます。通常はそれほど問題ではありませんが、問題が発生した場合は、サイズを強制するために醜いハックに頼る必要があります。
ポイント3については、C++11 では、enum
s は暗黙的に変換可能ではなく、int
s や他のenum
型と比較することもできません。関数のオーバーロードによる頭痛やその他の暗黙的な変換の問題を回避するのに役立ちます。
個人的には、tcp ベースのメッセージング プロトコルで使用しました。フィールドの多くは、メッセージング インターフェイスを尊重するために、1 バイトのみでエンコードする必要がある列挙型の値でした。
私のすべての列挙型は、次のように単純に定義されました。
enum class EnumFieldA : unsigned char { eValProperty1, eValProperty2};
enum class EnumFieldB : unsigned char { eValProperty1, eValProperty2, eValProperty3};
enum class EnumFieldC : unsigned char { eValProperty1, eValProperty2, eValProperty3, eValProperty4};
...
この SO questionには、完全な回答もたくさんあります。
最初はあなたの質問に戸惑いましたが、c++ enum と c++11 の enum の違いを知りたいと思います。私が理解できる限り、後で、列挙型を厳密に型指定して、それらをスコープできるようにしました。これでよくわかると思います。乾杯