在运行时查询模板特化的方法/避免大开关

时间:2011-07-11 03:28:37

标签: c++ metaprogramming switch-statement boilerplate

我有一个枚举类型:

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 个答案:

答案 0 :(得分: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
}