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);