C++ で列挙型を文字列に変換する方法
この記事では、C++ で列挙型を文字列変数に変換するいくつかの方法を説明します。
C++ で列挙型を文字列に変換するには const char*
配列を使用する
enum
は組み込み型であり、通常は配列として形成される小さな名前付き整数を宣言するのに用いることができます。このメカニズムは、エラーが発生しにくく、より読みやすい整数値の集合を表現する方法を提供します。
列挙要素は位置的な値を持つこともできますし(この例では Banana
が 0
を持つように)、明示的な値を持つこともできます(enum Fruit { Banana = 34, ... }
のように宣言されています)。
この例では、enum
要素の暗黙の値を利用して、配列から対応する文字列の値にアクセスする方法を示しています。実世界のシナリオをよりよく示すために、main
関数の最初にランダムな input
変数を 1-4 の範囲の値で初期化していることに注意してください。
#include <chrono>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
enum Fruit { Banana, Coconut, Mango, Carambola, Total };
static const char *enum_str[] = {"Banana Pie", "Coconut Tart", "Mango Cookie",
"Carambola Crumble"};
int main() {
std::srand(std::time(nullptr));
int random = rand() % Total;
auto input = static_cast<Fruit>(random);
switch (input) {
case Banana:
cout << enum_str[Banana] << endl;
break;
case Coconut:
cout << enum_str[Coconut] << endl;
break;
case Mango:
cout << enum_str[Mango] << endl;
break;
case Carambola:
cout << enum_str[Carambola] << endl;
break;
case Total:
cout << "Incorrect ingredient!" << endl;
break;
}
return EXIT_SUCCESS;
}
出力(*random
):
Banana Pie
C++ で列挙型を文字列に変換するためにカスタム定義関数を使用する
あるいは、独自の関数を定義して、整数をパラメータとして受け取り文字列の値を返すこともできます。文字列変数は、関数内の enum_str
配列の const char*
値で初期化されます。関数 getStringForEnum
の引数に Total
を渡すと、enum_str
配列は 4つの要素しかないので、何らかのゴミのような値を返します。
#include <chrono>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
enum Fruit { Banana, Coconut, Mango, Carambola, Total };
static const char *enum_str[] = {"Banana Pie", "Coconut Tart", "Mango Cookie",
"Carambola Crumble"};
string getStringForEnum(int enum_val) {
string tmp(enum_str[enum_val]);
return tmp;
}
int main() {
string todays_dish = getStringForEnum(Banana);
cout << todays_dish << endl;
return EXIT_SUCCESS;
}
出力:
Banana Pie
上記の enum
型に Total
要素を含めることで、実用的な使い方ができます。例えば、以下のサンプルコードに示すように、これはループパラメータとして利用できる列挙の要素数を表しています。最初のループは enum_str
配列からすべての文字列を抽出して enum_strigs
ベクトル変数にプッシュします。2 回目の繰り返しでは、enum_strigs
の内容をコンソールに出力します。
#include <chrono>
#include <iostream>
#include <string>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
enum Fruit { Banana, Coconut, Mango, Carambola, Total };
static const char *enum_str[] = {"Banana Pie", "Coconut Tart", "Mango Cookie",
"Carambola Crumble"};
string getStringForEnum(int enum_val) {
string tmp(enum_str[enum_val]);
return tmp;
}
int main() {
vector<string> enum_strigs{};
enum_strigs.reserve(Total);
for (int i = 0; i < Total; ++i) {
enum_strigs.push_back(getStringForEnum(i));
}
for (const auto &item : enum_strigs) {
cout << item << endl;
}
return EXIT_SUCCESS;
}
出力:
Banana Pie
Coconut Tart
Mango Cookie
Carambola Crumble