6

C++11 で 1 行も書いたことがなく、現時点では C++11 でプログラミングする機会がない人のために、短いパラグラフで教えてください。

「列挙型クラス」とは何ですか? なぜ必要なのですか?

4

4 に答える 4

14

enum classスコープ列挙と呼ばれます。列挙子の名前で列挙が表示される名前空間を汚染するのを防ぎます。

C++03 では、enum内部に専用の を配置することで、同じことを効果的に行うことができますclass。おそらくそれが構文のソースであり、少し混乱しています。

intもう 1 つの違いは、そのような型の列挙子は暗黙的に(static_cast<int>が必要です)に変換されないことです。これが必要になることはめったにありませんが、int引数を取る関数を 1 つの型を取ることで安全にオーバーロードできますenumintが誤って呼び出されることはありません。または、専用の関数を使用して疑似整数型を定義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

于 2012-12-26T14:39:05.197 に答える
0
  1. データ サイズが重要な場合は、ストレージ タイプを明示的に指定できます (おそらく構造体にパックします)。
  2. 列挙値のスコープは、列挙型の名前のみです。c++11 より前では、囲んでいるスコープにリークしていました。
  3. 変換ルールも少し変更されたように思います...

ポイント 1 に関連して、enums のストレージ サイズは、列挙型に割り当てられた最大値に応じて C++11 より前に変更されます。通常はそれほど問題ではありませんが、問題が発生した場合は、サイズを強制するために醜いハックに頼る必要があります。

ポイント3については、C++11 では、enums は暗黙的に変換可能ではなく、ints や他のenum型と比較することもできません。関数のオーバーロードによる頭痛やその他の暗黙的な変換の問題を回避するのに役立ちます。

于 2012-12-26T14:19:28.430 に答える
0

個人的には、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には、完全な回答もたくさんあります。

于 2012-12-26T14:21:20.237 に答える
-1

最初はあなたの質問に戸惑いましたが、c++ enum と c++11 の enum の違いを知りたいと思います。私が理解できる限り、後で、列挙型を厳密に型指定して、それらをスコープできるようにしました。これでよくわかると思います。乾杯

于 2012-12-26T14:12:24.273 に答える