enum: 型安全な定数
enum class で名前衝突を防ぐ。スイッチ文と相性抜群。
enum
列挙型。名前付き定数の集合。
enum class
スコープ付き列挙型(推奨)。名前空間を汚染しない。
基底型
enumが内部で使用する整数型。デフォルトはint。
列挙型
プログラム中に `0` や `1` という数字が散らばっていると、それが「状態」なのか「個数」なのか分からなくなります(マジックナンバー)。enumを使えば `Status::Active` のように名前がつき、読みやすさと安全性が劇的に向上します。
// 従来の enumenum Color { Red, Green, Blue };Color c = Red; // スコープなし
// enum class (C++11, 推奨)enum class Status { Pending, Active, Closed };Status s = Status::Active; // スコープ付き (Status::が必要)
// 基底型を指定(メモリ効率)enum class Flags : unsigned char { None = 0, Read = 1 << 0, Write = 1 << 1, Execute = 1 << 2,};型安全性
enum class Status { Active };\nStatus s = Status::Active; // OK\ns = 1; // コンパイルエラー! Bad
// ❌ Bad: 従来の enumenum Color { Red };enum Priority { Red }; // エラー!名前衝突Good
// ✅ Good: enum classenum class Color { Red };enum class Priority { Red }; // OK!// Color::Red と Priority::Red は別物パターン
// switch との組み合わせswitch (status) { case Status::Pending: handle_pending(); break; case Status::Active: handle_active(); break; // Closed が抜けているとコンパイラが警告してくれる(defaultがない場合)}
// 文字列変換(C++には標準の to_string(enum) がない)std::string to_string(Status s) { switch (s) { case Status::Pending: return "Pending"; case Status::Active: return "Active"; case Status::Closed: return "Closed"; } return "Unknown";}
// 整数への変換(明示的キャストが必要)int val = static_cast<int>(Status::Active); Tip: 常に enum class を使う。従来の enum は名前空間を汚染するため避ける。
合格ライン
enum class を定義できる
switch で enum を扱える
参考リンク
演習課題
課題1: enum class 定義
HTTP ステータスコードを表す enum class を定義し、switch で処理してください。
課題2: 文字列変換
enum class を文字列に変換する to_string 関数を作成してください。