У меня есть набор типов перечислений в некоторых файлах заголовков библиотеки, которые я использую, и я хочу иметь способ преобразования значений перечисления в строки пользователя - и наоборот.
RTTI не сделает этого для меня, потому что "пользовательские строки" должны быть более читабельными, чем перечисления.
Решение с грубой силой будет представлять собой набор функций, подобных этому, но я чувствую, что слишком C-like.
enum MyEnum {VAL1, VAL2,VAL3};
String getStringFromEnum(MyEnum e)
{
  switch e
  {
  case VAL1: return "Value 1";
  case VAL2: return "Value 2";
  case VAL1: return "Value 3";
  default: throw Exception("Bad MyEnum");
  }
}
У меня есть ощущение, что там есть элегантное решение, использующее шаблоны, но я пока не могу его обогнуть.
ОБНОВЛЕНИЕ: Спасибо за предложения. Я должен был четко указать, что перечисления определены в заголовке третьей стороны, поэтому я не хочу менять их определение.
Теперь мне нужно избегать шаблонов и делать что-то вроде этого:
char * MyGetValue(int v, char *tmp); // implementation is trivial
#define ENUM_MAP(type, strings) char * getStringValue(const type &T) \
 { \
 return MyGetValue((int)T, strings); \
 }
; enum eee {AA,BB,CC}; - exists in library header file 
; enum fff {DD,GG,HH}; 
ENUM_MAP(eee,"AA|BB|CC")
ENUM_MAP(fff,"DD|GG|HH")
// To use...
    eee e;
    fff f;
    std::cout<< getStringValue(e);
    std::cout<< getStringValue(f);
