だから、私はenumToString
よく使ういくつかの列挙型の関数を実装しました(SOでよく聞かれます:C ++列挙型を文字列に変換する簡単な方法はありますか?、Cで列挙型の変数を文字列として使用する簡単な方法はありますか?、... )。これにより、エラーメッセージのデバッグがはるかに簡単になりますが、文字列の説明がない値を追加する関数を維持する必要がある場合があります。
私のコードは次のようになります。
typedef std::map<my_enum_e, const char *> enum_map_t;
static bool s_enum_map_initialized = false;
static enum_map_t s_enum_strings;
static void s_init_maps()
{
#define ADD_ENUM( X ) s_enum_strings[X] = #X;
if( s_enum_strings.size() == 0)
{
ADD_CLASS( MY_ENUM_1 );
ADD_CLASS( MY_ENUM_2 );
/* ... all enums */
}
s_enum_map_initialized = true;
}
const char *Tools::enumCString( my_enum_e e )
{
if( ! s_enum_map_initialized )
{
s_init_maps();
}
// todo: use the iterator instead of searching twice
if( s_enum_strings.find(e) != s_enum_strings.end() )
{
return s_class_strings[e];
}
return "(unknown enum_e)";
}
さて、私が欲しいのは、マップに列挙型が見つからない場合に、を返すこと"(unknown enum %d)", e
です。これにより、見逃した列挙型の値がわかります。
このようにして、マップに追加しなくても、その値が残っているので、プログラムをデバッグできます。
それを簡単に行う方法を見つけることができません。スタックにインスタンス化された文字列ストリームは、戻った直後に破棄されます。静的な文字列ストリームはスレッドセーフではありません...
編集:もちろん、return型として使用するとフォーマットできますが、コードでこれらの関数を頻繁に呼び出すので、std :: stringをプッシュする必要がないためstd::string
、ポインターを渡す方が速いと思いました。const char *
毎回スタック。
解決策はありますか?