C++ nie ma sposobu na uzyskanie reprezentacji łańcuchowej wyliczenia. Ludzie to obejść poprzez pisanie własnych funkcji, które zawierają dużo kodu boilerplate aka
switch
z case XYZ return "XYZ";
Czy przesłanianie std :: to_string dla zdefiniowanych przez użytkownika wylicza właściwy sposób dostarczania to_string dla zdefiniowanych przez użytkownika wyliczeń?
To oczywiście wymaga użytkownikom wyliczenia znać nazwę funkcji niestandardowej.
Więc pomyślałem, że mogę dodać specjalizację do std::to_string
, aby umożliwić użytkownikowi korzystanie z to_string
w moich podsumowaniach. Coś takiego:
//
#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;
}
Czy są jakieś problemy z tym rozwiązaniem?
Nie sądzę, że przeładowywanie funkcji standardowych jest dozwolone, a jedynie specjalizowane szablony. – chris
Dwie rzeczy: chciałbym sprawdzić użycie '#define str (x) # x' (i związanego z nim' #define klej (a, b) a ## b'), aby sprawdzić, czy pasuje do twoich potrzeb z mniejszą tabelą . Po prostu zapnij go w funkcji bezpieczeństwa typu i "# undef" zaraz po zakończeniu. Po drugie, a co mniej ważne, zapomniałeś o 'przełamaniu 'w swoim przełączniku - prawdopodobnie dając powód, by nie używać go, jeśli nie czujesz się super-drażliwy. – FizzixNerd