C++ non ha un modo per ottenere la rappresentazione della stringa di un enum. La gente aggirare questo scrivendo funzioni personalizzate che contengono un sacco di codice boilerplate aka
switch
con case XYZ return "XYZ";
Sostituisce std :: to_string per le enumerazioni definite dall'utente il modo corretto di fornire to_string per le enumerazioni definite dall'utente?
Questo naturalmente richiede agli utenti del enum di conoscere il nome della funzione personalizzata.
Quindi ho pensato di aggiungere una specializzazione a std::to_string
per consentire a un utente di utilizzare to_string
sulle mie enumerazioni. Qualcosa di simile:
//
#include <iostream>
#include <string>
#include <cassert>
#define TEST
class Car
{
public:
enum class Color
{
Red,
Blue,
White
};
};
#ifdef TEST
#include <string>
namespace std
{
std::string to_string (Car::Color c)
{
switch (c)
{
case Car::Color::Red:
return "Red";
case Car::Color::Blue:
return "Blue";
case Car::Color::White:
return "White";
default:
{
assert(0);
return "";
}
}
}
}
#endif
int main()
{
std::cout << std::to_string(Car::Color::White) << std::endl;
}
Ci sono problemi con questa soluzione?
Non penso che sia possibile sovraccaricare le funzioni std, solo modelli specializzati. – chris
Due cose: vorrei controllare l'uso di '#define str (x) # x' (e l'associato' #define glue (a, b) a ## b') per vedere se ciò si adatta alle tue esigenze con meno boilerplate . Assicurati di racchiuderlo in una funzione per la sicurezza del tipo e di "# undef" subito dopo aver terminato. In secondo luogo, e meno importante, hai dimenticato il 'break;' s nel tuo switch - probabilmente dando una ragione per non usarne uno se non ti senti super-testy. – FizzixNerd