Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
#include <iostream>
#include <map>
#include <string>
#include <initializer_list>
template<class T>
class EnumMap
{
private:
std::map<T, std::string> _to_string;
std::map<std::string, T> _from_string;
public:
EnumMap(const std::initializer_list<std::pair<T, std::string>> & init_list)
{
for (auto &item : init_list)
{
_to_string[item.first] = item.second;
_from_string[item.second] = item.first;
}
}
std::string to_string(T value)
{
return _to_string[value];
}
T from_string(const std::string & value)
{
return _from_string[value];
}
};
enum A
{
A_ZERO,
A_ONE,
A_TWO
};
EnumMap<A> amap =
{
{A_ZERO, "zero"},
{A_ONE, "one"},
{A_TWO, "two"}
};
enum B
{
B_CAR,
B_BUS,
B_PLANE
};
EnumMap<B> bmap =
{
{B_CAR, "car"},
{B_BUS, "bus"},
{B_PLANE, "plane"}
};
int main(int argc, char *argv[])
{
std::cout << amap.from_string("zero") << std::endl;
std::cout << amap.to_string(A_TWO) << std::endl;
std::cout << bmap.to_string(B_PLANE) << std::endl;
std::cout << bmap.from_string("bus") << std::endl;
return 0;
}
enum TestEnum{
fruit_apple = 0,
fruit_banana,
fruit_mango,
fruit_orange,
};
static const char * TestEnumStrings[] = {
"fruit_apple",
"fruit_banana",
"fruit_mango",
"fruit_orange"
};
std::string toString(const TestEnum &fruit){
return TestEnumStrings[fruit];
};
Расширяемые отображения любых типов значений без использования макросов