Zamiana wartości enum na string i odwrotnie

0

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

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;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1