【c++】enum struct(class)とは


元ブログ

c++でenumを宣言する際に以下の様な宣言を見たことはないですか?

// どこかのheaderファイル
enum struct HogeEnum
{
  FAILURE,
  SUCCESS,
};

※structはclassにもなり得る

このstructとかclassって何なんだろう?と言う疑問があり調べてみました。

struct(class)の二つの意味

結論、二つの意味がありそうでした。

・異なるenum値で同じ列挙子を用いる事を可能にする
・int値との違いを明確なものにする

少し解説

※参考
プログラミング言語C++第4版

以下の様なコードはコンパイルは通るでしょうか?


// Test.h
enum Color
{
    RED,
    BLUE,
    PURPLE,
};
enum TrafficLight
{
    RED,
    YELLOG,
    GREEN
};

// Test.cpp
Color c_red = Color::RED;
TrafficLight t_red = TrafficLight::RED;

まぁ、流れ的に分かりそうですがこれは通りません。


では、どうすれば通るのでしょうか?

同名の列挙子を用いる事を可能にする

以下の様に変更すると通ります。(c++11以降 [thanks for 7of9さん])


enum struct Color
{
    RED,
    BLUE,
    PURPLE,
};
enum struct TrafficLight
{
    RED,
    YELLOG,
    GREEN
};

structを追加しました。
※classでも通ります。
※両方にstructを追加していますが片方だけ追加するだけで通ります。

structを追加したことにより、各列挙子のスコープが明確なものになり、ビルドが通るようになりました。

intとの相互変換

structを加えなければ実はそのまま代入が出来ます。


int red = Color::RED;

の具合ですね。

structがある場合は以下の形で相互に変換出来ます。

int => enum値

Color enumColorRed = static_cast<Color>(0);

enum値 => int


int intColorRed = static_cast<int>(Color::RED);