0Pricing
C++ Academy · レッスン

スコープ付きenum class

型安全な列挙型を使用します

「スコープ付きenum class」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

通常の enum は名前を漏洩させる

従来の C スタイルの enum は、その名前を周囲のスコープに展開し、暗黙的に int に変換します。そのため、名前の衝突や意図しない比較が起こりやすくなります。

  • enum class はこの両方の問題を解決します。
  • 値がスコープ付きになり、強い型付けが適用されます。
#include <iostream>
enum Color { Red, Green, Blue };
int main() {
    Color c = Green;
    int x = c; // implicit conversion to int
    std::cout << x << "\n";
}

スコープ付き enum の宣言

class(または struct)キーワードを追加すると、スコープ付き列挙型になります。これで、それぞれの値に enum 名を付けて指定する必要があります。

#include <iostream>
enum class Color { Red, Green, Blue };
int main() {
    Color c = Color::Green;
    if (c == Color::Green) std::cout << "green\n";
}

暗黙的な変換がない

スコープ付き enum は int に暗黙的に変換されません。これにより、enum が誤って算術演算に使われるバグを防げます。

  • 数値を取得するには、明示的にキャストする必要があります。
#include <iostream>
enum class Color { Red, Green, Blue };
int main() {
    Color c = Color::Blue;
    int n = static_cast<int>(c); // explicit
    std::cout << n << "\n"; // prints 2
}

基底型

デフォルトの基底型は int ですが、容量を節約したりプロトコルに合わせたりするために、より小さい型や特定の整数型を選べます。

#include <iostream>
#include <cstdint>
enum class Status : std::uint8_t { Ok = 0, Warn = 1, Error = 2 };
int main() {
    Status s = Status::Warn;
    std::cout << static_cast<int>(s) << "\n";
}

値を指定する

列挙子に明示的な値を割り当てられます。明示的な値の後に続く値は、そこから数え続けます。

#include <iostream>
enum class Http { Ok = 200, NotFound = 404, ServerError = 500 };
int main() {
    Http h = Http::NotFound;
    std::cout << static_cast<int>(h) << "\n";
}

enum を switch で処理する

enum は switch 文の中で特に役立ちます。すべての case を列挙すると意図が明確になり、コンパイラーから不足している case について警告を受けられます。

#include <iostream>
enum class Dir { North, East, South, West };
const char* name(Dir d) {
    switch (d) {
        case Dir::North: return "N";
        case Dir::East:  return "E";
        case Dir::South: return "S";
        case Dir::West:  return "W";
    }
    return "?";
}
int main() { std::cout << name(Dir::East) << "\n"; }

関数引数として enum を使う

スコープ付き enum を渡すと、単なる int や bool を渡すよりも意図をはるかに明確に伝えられます。コンパイラーによって、有効な enum 値だけが使われることも保証されます。

#include <iostream>
enum class Align { Left, Center, Right };
void render(const char* text, Align a) {
    std::cout << text << " aligned " << static_cast<int>(a) << "\n";
}
int main() { render("Hi", Align::Center); }

enum 値を比較する

スコープ付き enum は == と != を直接サポートします。値には順序があるため、関係演算子(<、>)も使えます。

#include <iostream>
enum class Level { Low, Medium, High };
int main() {
    Level l = Level::High;
    std::cout << (l > Level::Low ? "above low\n" : "low\n");
}

概念的な反復処理

enum は自動的には反復できませんが、基底整数型を経由してキャストするのが一般的なパターンです。範囲を把握できるように、Count のような番兵値を用意しておきます。

#include <iostream>
enum class Coin { Penny, Nickel, Dime, Count };
int main() {
    for (int i = 0; i < static_cast<int>(Coin::Count); ++i)
        std::cout << i << " ";
    std::cout << "\n";
}

型安全性が重要な理由

関連のない 2 つのスコープ付き enum は、どちらにも None という名前の値があったとしても、誤って混在させることはできません。コンパイラーはそれらを別々の型として扱います。

#include <iostream>
enum class Fruit { None, Apple };
enum class Tool  { None, Hammer };
int main() {
    Fruit f = Fruit::None;
    // Tool t = f; // would NOT compile
    std::cout << (f == Fruit::None) << "\n";
}

通常の enum を使う場合

通常の enum は、暗黙的な int 変換が便利なレガシー API やビットフラグのコードで今も使われています。新しいコードでは、特別な理由がない限り enum class を優先してください。

確認テスト

スコープ付き enum についての理解度を確認します。

まとめ

スコープ付き enumについて学びました。

  • enum class は値にスコープを設定し、暗黙的な int 変換を禁止します。
  • 数値を読み取るには static_cast<int> を使います。
  • : type で基底型を選べます。
  • 型安全で自己文書化されたコードには enum class を優先してください。

よくある質問

「スコープ付きenum class」レッスンは無料ですか?

はい。「スコープ付きenum class」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「スコープ付きenum class」で何を学びますか?

型安全な列挙型を使用します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「スコープ付きenum class」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. スコープ付きenum class
  2. unionとそのリスク
  3. std::variant
  4. std::visit
← C++ Academyに戻る