在运行时查询模板专业化的方法/避免大切换

发布于 2024-11-19 18:02:23 字数 800 浏览 4 评论 0原文

我有一个枚举类型:

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();
   .....
}

是否有一些元编程(模板或宏)魔法可以帮助我避免所有这个样板和容易出错的编码?

I have a enum type:

enum class MyEnumType { A , B , C };

and i want to map these enums to description attributes; i like this approach a lot:

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"; }

....

a bit verbose but not that bad, right?

Now, the part that is cumbersome is when i want to get a description from a enumerator at run-time, it means i need to create a big-switch function

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

is there some metaprogramming (template or macro) magic that would help me avoid all this boilerplate and error-prone coding?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

淡淡離愁欲言轉身 2024-11-26 18:02:23

我建议将其映射到一个数组:

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
}

I would suggest to map it to an array:

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

And based on index you can get the type at runtime.

const char* getDescriptionFromEnumerator(MyEnumType t) 
{
  return pEnumDescription[t];  // just one statement instead of switch/case
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文