C++ で列挙型を文字列に変換する方法

胡金庫 2023年10月12日
  1. C++ で列挙型を文字列に変換するには const char* 配列を使用する
  2. C++ で列挙型を文字列に変換するためにカスタム定義関数を使用する
C++ で列挙型を文字列に変換する方法

この記事では、C++ で列挙型を文字列変数に変換するいくつかの方法を説明します。

C++ で列挙型を文字列に変換するには const char* 配列を使用する

enum は組み込み型であり、通常は配列として形成される小さな名前付き整数を宣言するのに用いることができます。このメカニズムは、エラーが発生しにくく、より読みやすい整数値の集合を表現する方法を提供します。

列挙要素は位置的な値を持つこともできますし(この例では Banana0 を持つように)、明示的な値を持つこともできます(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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Enum