C で if/switch を使用せずに列挙値をテキストとして出力する
C では、列挙型を使用して整数値をシンボリック名に割り当てる方法が提供されます。ただし、列挙値をコンソールに出力する場合、通常はシンボル名の代わりに関連する整数が出力されます。
この制限を克服して列挙値をテキストとして出力するには、3 つの効率的なソリューションを検討してみましょう。
1.マップの使用:
std::map を使用すると、列挙値を対応するテキスト表現に効率的に検索できます。
#include <map> #include <string_view> enum Errors { ErrorA = 0, ErrorB, ErrorC }; // Custom insertion function for map #define INSERT_ELEMENT(p) result.emplace(p, #p); // Initialize the map static const auto strings = []() { std::map<Errors, std::string_view> result; INSERT_ELEMENT(ErrorA); INSERT_ELEMENT(ErrorB); INSERT_ELEMENT(ErrorC); return result; }; std::ostream& operator<<(std::ostream& out, const Errors value) { return out << strings[value]; }
2.線形検索で構造体の配列を使用する:
このアプローチには、列挙値とそれに対応するテキストを含む構造体の配列の作成が含まれます。次に、線形検索を使用して、目的の列挙値のテキストを取得します。
#include <string_view> enum Errors { ErrorA = 0, ErrorB, ErrorC }; // Structure for mapping enum to text struct MapEntry { Errors value; std::string_view str; }; std::ostream& operator<<(std::ostream& out, const Errors value) { const MapEntry entries[] = { {ErrorA, "ErrorA"}, {ErrorB, "ErrorB"}, {ErrorC, "ErrorC"} }; const char* s = nullptr; for (const MapEntry* i = entries; i->str; i++) { if (i->value == value) { s = i->str; break; } } return out << s; }
3. switch/case の使用:
マップ手法よりも効率は劣りますが、switch/case を使用して列挙値をテキストにマップすることもできます。
#include <string> enum Errors { ErrorA = 0, ErrorB, ErrorC }; std::ostream& operator<<(std::ostream& out, const Errors value) { return out << [value]() { switch (value) { case ErrorA: return "ErrorA"; case ErrorB: return "ErrorB"; case ErrorC: return "ErrorC"; } }; }
以上がif/switch ステートメントを使用せずに C Enum 値をテキストとして出力するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。