😊

[C++]enumではなくenum classを使うメリット

2023/04/30に公開

C言語には列挙型と言われるenumがあったがC++ではenumをバージョンアップさせたenum classという便利なものがある。今日はそのenum classについてメリットを話してみる。

enum classのメリット

メリット①:enum値がスコープ持つ

C言語までのenumだとスコープを持つことができない。そのため以下のように既に他のenumで使用したenum値と同じ名前を使うとコンパイルエラーになってしまっていた。

enum TaroColor
{ 
  Red, 
  Green,
  Blue
};
enum TomColor
{ 
  Red,   // コンパイルエラー
  Green, // コンパイルエラー
  Blue   // コンパイルエラー
};

このため異なるenumの種類でも中のenum値の名前は変えなければいけなかった。

しかしenum classは各enumがスコープを持つ。そのため同じenum値の名前を使うことができるので名前の衝突を気にする必要が無くてラク。

enum class TaroColor
{ 
  Red, 
  Green,
  Blue
};
enum class TomColor
{ 
  Red,   // コンパイルOK
  Green, // コンパイルOK
  Blue   // コンパイルOK
};

メリット②:enum値のデータ型を指定できる

:を付けてenum値のデータ型を指定することで指定したデータ型で範囲チェック等をしてくれる。例えば以下はunsigned charを指定しているので0~255の範囲のenum値かチェックされる。

enum class TaroColor : unsigned char
{ 
  Red, 
  Green,
  Blue
};

型の範囲外のenum値を使うとコンパイルエラーにしてくれるのでコンパイル時に気づくことができる。

使用する際に暗黙的な型変換は許可されないので、以下のように暗黙的な型変換をしようとしているとコンパイルエラーにしてくれる。

unsigned char color = TaroColor::Red; // 暗黙的な型変換なのでコンパイルエラー
unsigned char color2 = static_cast<unsigned char>(TaroColor::Red); // コンパイルOK

補足

  • 何も型指定をしない場合はint型として自動で扱われる。
  • C++11以降はenum classではない普通のenumでも型指定は可能。

Discussion