Aufzählung in Zeichenfolge: Gibt den ganzzahligen Wert der Aufzählung zurück, falls ungültig / nicht gefunden

Also habe ich eine implementiertenumToString Funktion für mehrere Enums, die ich oft benutze (oft in SO gefragt:Gibt es eine einfache Möglichkeit, C ++ - Enumeration in Zeichenfolge zu konvertieren?, Einfache Möglichkeit, Variablen von Aufzählungstypen als Zeichenfolge in C zu verwenden?, ...). Dies macht die Fehlermeldungen leichter zu debuggen, aber ich muss die Funktion beibehalten, um die Werte hinzuzufügen, die manchmal keine Zeichenfolgenbeschreibung haben.

Mein Code sieht so aus:

<code>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)";
}
</code>

Nun, was ich will, ist das, wenn ichnicht Finde die Aufzählung in der Karte, um zurückzukehren"(unknown enum %d)", e . Welches wird mir den Wert der Aufzählung geben, die ich verpasst habe.

Auf diese Weise habe ich, auch wenn ich es nicht zur Karte hinzugefügt habe, immer noch seinen Wert und kann mein Programm debuggen.

Ich kann nicht einfach einen Weg finden, dies zu tun: Ein auf dem Stack instanziierter Stringstream wird direkt nach der Rückkehr zerstörtstatisch stringstream ist nicht threadsicher, ...

bearbeiten: natürlich mit einemstd::string Als Rückgabetyp würde es mir erlauben, es zu formatieren, aber ich rufe diese Funktionen sehr oft in meinem Code aufconst char * Der Zeiger ist schneller, da ich den std :: string nicht jedes Mal auf den Stack schieben muss.

Irgendeine Lösungsmöglichkeit?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage