Способы запроса специализаций шаблона во время выполнения / обход большого переключателя
У меня есть тип 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
}