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

У меня есть тип 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 Ответ

1 голос
/ 11 июля 2011

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

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...