Самая распространенная реализация в c ++ - настроить карту для этого:
#include <iostream>
#include <unordered_map>
#include <string>
enum MY_ENUM {
TYPE_1
, TYPE_2 = 42 // Mind the gap please!
};
const char* const option1(MY_ENUM type) {
static std::unordered_map<MY_ENUM, const char* const> enum2StringMap =
{ { TYPE_1, "a" }
, { TYPE_2, "b" }
// ...
};
if(enum2StringMap.find(type) == enum2StringMap.end()) {
// throw exception or do whatever to indicate an error
return "Invalid enum value";
}
return enum2StringMap[type];
}
Для опции и наоборот вам может понадобиться взять на себя бремя, чтобы сохранить вторую карту, и синхронизировать ее с 1-й:
MY_ENUM option1(const std::string& s) {
static std::unordered_map<std::string, MY_ENUM> string2EnumgMap =
{ { "a" , TYPE_1 }
, { "b" , TYPE_2 }
// ...
};
if(string2EnumgMap.find(s) == string2EnumgMap.end()) {
// throw exception or do whatever to indicate an error
}
return string2EnumgMap[s];
}
Другим вариантом, упрощающим синхронизацию (но может иметь и другие недостатки в отношении производительности), может быть использование boost::bimap
.
int main() {
std::cout << option1(TYPE_1) << std::endl;
std::cout << option1(TYPE_2) << std::endl;
std::cout << option1("a") << std::endl;
std::cout << option1("b") << std::endl;
}
Выход:
a
b
0
42
Не так, как "дешево" , как @ r3musn0x предлагаемое решение , но устраняет проблемы, упомянутые в @ Комментарий Константина .
Когда инициализируются карты при первом доступе, будут небольшие накладные расходы, но любой последующий поиск может быть оптимизирован для O (log n) против O (n) сложность времени .
См. Рабочую онлайн-демонстрацию .