列挙型変数の文字列への変換は、プログラミングにおける一般的な要件です。たとえば、列挙値を読み取り可能な形式で出力する場合、または文字列引数を期待する関数にパラメータとして渡す場合に、これが必要になります。
列挙型への 1 つの直接的なアプローチ型変換は、列挙型ごとに手動関数を作成することです。たとえば、OS_type 列挙型を変換するには:
enum OS_type { Linux, Apple, Windows }; inline const char* ToString(OS_type v) { switch (v) { case Linux: return "Linux"; case Apple: return "Apple"; case Windows: return "Windows"; default: return "[Unknown OS_type]"; } }
ただし、このアプローチでは、列挙型の数が増えるとメンテナンスの問題が発生しやすくなります。
Boost.Preprocessor ライブラリは、列挙型変換を処理するためのより洗練された自動化された方法を提供します。プリプロセッサを利用して変換関数を動的に生成します。次の 2 つのマクロでこれを実現します。
#define X_DEFINE_ENUM_WITH_STRING_CONVERSIONS_TOSTRING_CASE(r, data, elem) \ case elem : return BOOST_PP_STRINGIZE(elem); #define DEFINE_ENUM_WITH_STRING_CONVERSIONS(name, enumerators) \ enum name { \ BOOST_PP_SEQ_ENUM(enumerators) \ }; \ \ inline const char* ToString(name v) \ { \ switch (v) \ { \ BOOST_PP_SEQ_FOR_EACH( \ X_DEFINE_ENUM_WITH_STRING_CONVERSIONS_TOSTRING_CASE, \ name, \ enumerators \ ) \ default: return "[Unknown " BOOST_PP_STRINGIZE(name) "]"; \ } \ }
これらのマクロを使用すると、OS_type 列挙型を次のように定義できます。
DEFINE_ENUM_WITH_STRING_CONVERSIONS(OS_type, (Linux)(Apple)(Windows))
In C では、ToString 関数を使用して enum 値を次のように変換できます。文字列:
#include <iostream> int main() { OS_type t = Windows; std::cout << ToString(t) << " " << ToString(Apple) << std::endl; }
C の場合、ToString 関数は関数オーバーロードの代わりにマクロとして実装できます:
#define ToString(t) \ [Unknown ""##t] [Linux "Linux"] [Apple "Apple"] [Windows "Windows"]
この記事では 2 つを紹介しました。 enum 型変数を文字列に変換するためのメソッド: 手動関数を使用した単純なアプローチと、Boost.Preprocessor を使用したプリプロセッサ ベースのソリューション。プリプロセッサベースのアプローチは、特に多数の列挙型を扱う場合に、より堅牢で保守が容易です。
以上がC および C で列挙型を文字列に効率的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。