Способы запроса специализаций шаблона во время выполнения / обход большого переключателя

У меня есть тип enum:

enum class MyEnumType { A , B , C };

и я хочу сопоставить эти перечисления с атрибутами описания; мне очень нравится такой подход:

template <typename T>
struct MyEnumTypeDescription
{
 inline const char* get() { static_assert("description not implemented for this type"); };
};

template<>
const char* MyEnumTypeDescription<MyEnumType::A>::get() { return "A"; }

template<>
const char* MyEnumTypeDescription<MyEnumType::B>::get() { return "B"; }

....

немного многословно, но не так уж плохо, правда?

Теперь громоздкая часть, когда я хочу получить описание от перечислителя во время выполнения, это означает, что мне нужно создать функцию с большим переключателем

const char* getDescriptionFromEnumerator( MyEnumType t ) 
{
   case MyEnumType::A:
       return MyEnumTypeDescription<MyEnumType::A>::get();
   .....
}

Есть ли какая-то магия метапрограммирования (шаблон или макрос), которая поможет мне избежать всего этого стандартного и подверженного ошибкам кодирования?

1 ответ

Решение

Я бы предложил сопоставить его с массивом:

enum MyEnumType { A , B , C };
const char *pEnumDescription[] = { "A", "B", "C" };

И на основе индекса вы можете получить тип во время выполнения.

const char* getDescriptionFromEnumerator(MyEnumType t) 
{
  return pEnumDescription[t];  // just one statement instead of switch/case
}
Другие вопросы по тегам