Mam dużo enumów, które przechowują różną konfigurację. Często potrzebuję zamieniać wartości enumów na string i odwrotnie.
Zastanawiam się jaki jest najkrótszy i najlepszy sposób na to, bo dla 1-2 to można sobie switch-case/if'a użyć ale jak będzie ich dziesiątki
i każdy powinien mieć własną funkcję/metodę do zamiany to urośnie tego naprawdę sporo.
0
0
Niestety, nie ma funkcji która zrobiłaby to automatycznie. Najpopularniejsze podejście to przedstawione tutaj.
http://en.cppreference.com/w/cpp/language/enum
Jeżeli nie zależy Ci bardzo na opisie, to możesz też rzutować sobie na int, wtedy wyprintuje Ci numer i łatwo sobie sprawdzisz co to znaczy.
enum color {
red,
yellow,
green = 20,
blue
};
enum class altitude : char {
high='h',
low='l', // C++11 allows the extra comma
};
std::ostream& operator<<(std::ostream& os, color c)
{
switch(c) {
case red : os << "red"; break;
case yellow : os << "yellow"; break;
case green : os << "green"; break;
case blue : os << "blue"; break;
default : os.setstate(std::ios_base::failbit);
}
return os;
}
std::ostream& operator<<(std::ostream& os, altitude al)
{
return os << static_cast<char>(al);
}
Osobiście zamieniłbym default na
default: os << "Unknown " << static_cast<int>(c); break;
ale to zależy od sytuacji.
0
Niestety bez mapowania się nie obejdzie, sam musiałem mapować dostępny filtry które były typu enum ( const FilterTypers ). Z konsoli na wejściu był string określający rodzaj filtru a do funkcji operującej na filtrach potrzebny był typ enum tak więc chyba nic innego się nie da zrobić i trzeba się na sztywno babrać w mapowanie:
int strToEnumFilter(const char* fname) {
int i = 0;
int total = 10;
const FilterTypes enumFilter[] = {BesselFilter, BlackmanFilter, BoxFilter, CatromFilter, HanningFilter, HermiteFilter, LanczosFilter, MitchellFilter, SincFilter, TriangleFilter};
const char* strFilter[] = {"Bessel", "Blackman", "Box", "Catrom", "Hanning", "Hermite", "Lanczos", "Mitchell", "Sinc", "Triangle"};
for(i = 0; i < total; i++)
if(strcmp(fname, strFilter[i]) == 0)
return enumFilter[i];
return 0;
}