スコープ付き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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- スコープ付きenum class
- unionとそのリスク
- std::variant
- std::visit