enum: 型安全な定数

enum class で名前衝突を防ぐ。スイッチ文と相性抜群。

enum
列挙型。名前付き定数の集合。
enum class
スコープ付き列挙型(推奨)。名前空間を汚染しない。
基底型
enumが内部で使用する整数型。デフォルトはint。

列挙型

レストランのメニュー

enumは「メニュー表」です。寿司屋で「鉛筆」は注文できません。メニュー(enum)にある「マグロ・サーモン・タマゴ」の中から選ばなければなりません。これにより「無効な注文(謎の数字)」を防ぎます。

プログラム中に `0` や `1` という数字が散らばっていると、それが「状態」なのか「個数」なのか分からなくなります(マジックナンバー)。enumを使えば `Status::Active` のように名前がつき、読みやすさと安全性が劇的に向上します。

enum vs enum class
// 従来の enum
enum 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: 従来の enum
enum Color { Red };
enum Priority { Red }; // エラー!名前衝突
Good
// ✅ Good: enum class
enum class Color { Red };
enum class Priority { Red }; // OK!
// Color::Red と Priority::Red は別物

パターン

switch, to_string
// 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 関数を作成してください。

次のステップ