私たちが持っているとき、
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
アクセス指定子があるため)?
すでに述べたものに加えて、enum class
の方が良いタイプセーフティ-enum class
列挙子は、暗黙的に整数に変換しません。
C++ 0xでは「enumクラス」が本当に必要ですか?
いいえ、enum class
は必要ありません。他の方法でも十分に同等の機能を得ることができます。しかし、そのロジックにより、C++で多くのものを「必要としない」。 vtableなどを使用して手動で実装できるため、仮想関数と継承を「必要としない」。メンバー関数は「必要」ではありません。これらは追加の引数を取ることでエミュレートできます。
プログラマーの生活を楽にする言語機能があります。何かcanを手動で行うからといって、そうすべきだという意味ではありません。
enum class
には次のプロパティがあります。
enum class
を見ると、最初は少し奇妙に見えるかもしれませんが、ほとんどの新機能には当てはまります。慣れてしまえば大丈夫です。enum class
定義の効果を作成するマクロがあります。このマクロがないと、すべてのコーナーケースを機能させるためにかなりの労力を費やす必要があります。それでも、someoneはそのマクロを記述してデバッグする必要がありました。だから、私たちはそれらを「必要としない」。しかし、彼らはまだ言語への素晴らしい追加です。
前者の場合、HELLO
の型はE
ではありませんが、後者の場合、HELLO
の型はE
です。
これがなぜ重要なのかについての良いデモンストレーションについては、 "" enum class "エミュレーションまたはMSVC 10.0の強固な代替案に対するHoward Hinnantの回答を参照してください。"
enum class
およびenum struct
は、C++ 0x FDIS§7.2/ 2に従って、「意味的に同等」(つまり同じ)です。
これらの新しい列挙型の他の利点を読む必要があると思います
はい、そうです。これまで誰も指摘していないようです。 enum
のサイズを設定し、C++標準に従って静止する必要がある場合はどうでしょうか。 enum class
できる。そして、すでに述べたようにtype safetyを使用します。 int
とenum
sを混在させることで、コードおよび混乱の可能性のあるバグが大幅に削減されます。それらは私にとって同じものではありませんでした。すごい。例:enum class foo : int16_t { ... }
各メンバーはint16_t
実装までではなく、私にとって「より良い」ものを決定します。
編集:
また、リストに重複した値(名前ではなく)を含めることができます。これはコンテキストに応じて多くの意味をなします。