web-dev-qa-db-ja.com

C ++ 11で「enumクラス」が本当に必要ですか?

私たちが持っているとき、

struct E { enum E_ { HELLO }; }; // 'E' is inheritable

なぜ必要なのか、

enum class E { HELLO };  // 'E' is not inheritable

IMOの2番目のバージョンは、1番目よりも多くの機能を提供しません。 enum classは、2つの中括弧{};!重要な面が欠けていますか?

マイナーな質問として、enum classおよびenum struct構文以外(両方にpublicアクセス指定子があるため)?

60
iammilind

すでに述べたものに加えて、enum classの方が良いタイプセーフティ-enum class列挙子は、暗黙的に整数に変換しません。

125
Kos

C++ 0xでは「enumクラス」が本当に必要ですか?

いいえ、enum classは必要ありません。他の方法でも十分に同等の機能を得ることができます。しかし、そのロジックにより、C++で多くのものを「必要としない」。 vtableなどを使用して手動で実装できるため、仮想関数と継承を「必要としない」。メンバー関数は「必要」ではありません。これらは追加の引数を取ることでエミュレートできます。

プログラマーの生活を楽にする言語機能があります。何かcanを手動で行うからといって、そうすべきだという意味ではありません。

enum classには次のプロパティがあります。

  1. 理解するのは簡単です。他の言語での列挙型の動作を反映しています。
  2. コンパイラー作成者からの要求は比較的少ない。 r値参照、可変テンプレート、ユーザー定義リテラルなどの機能と実装の取り組みを比較してください。
  3. 構文を壊すことはありません。 enum classを見ると、最初は少し奇妙に見えるかもしれませんが、ほとんどの新機能には当てはまります。慣れてしまえば大丈夫です。
  4. 通常の列挙がどのように機能するかを再定義しないという点で、100%下位互換性があります。古いスタイルの列挙型は、以前と同じように機能します。
  5. これにより、大量の定型コードを記述する必要がなくなります。 Boostには、enum class定義の効果を作成するマクロがあります。このマクロがないと、すべてのコーナーケースを機能させるためにかなりの労力を費やす必要があります。それでも、someoneはそのマクロを記述してデバッグする必要がありました。

だから、私たちはそれらを「必要としない」。しかし、彼らはまだ言語への素晴らしい追加です。

93
Nicol Bolas

前者の場合、HELLOの型はEではありませんが、後者の場合、HELLOの型はEです。

これがなぜ重要なのかについての良いデモンストレーションについては、 "" enum class "エミュレーションまたはMSVC 10.0の強固な代替案に対するHoward Hinnantの回答を参照してください。"

enum classおよびenum structは、C++ 0x FDIS§7.2/ 2に従って、「意味的に同等」(つまり同じ)です。

24
James McNellis

これらの新しい列挙型の他の利点を読む必要があると思います

  • ユーザー定義サイズ
  • スコープ付きの値(より一般的なスコープの値の詰め込みはありません)
  • 整数型への暗黙的な変換はありません
  • 列挙型の前方宣言(APIの列挙型の最大の改善)

http://www.stroustrup.com/C++11FAQ.html#enum

16
David

はい、そうです。これまで誰も指摘していないようです。 enumのサイズを設定し、C++標準に従って静止する必要がある場合はどうでしょうか。 enum class できる。そして、すでに述べたようにtype safetyを使用します。 intenumsを混在させることで、コードおよび混乱の可能性のあるバグが大幅に削減されます。それらは私にとって同じものではありませんでした。すごい。例:enum class foo : int16_t { ... }各メンバーはint16_t実装までではなく、私にとって「より良い」ものを決定します。

編集:

また、リストに重複した値(名前ではなく)を含めることができます。これはコンテキストに応じて多くの意味をなします。

2
The Mask