在运行时查询模板专门化的方法/避免大的切换
ways to query template specializations at run-time / avoiding the big switch
有一个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();
.....
}
是否有一些元编程(模板或宏)魔法可以帮助我避免所有这些样板文件和易出错的编码?
我建议将它映射到一个数组:
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
}
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- Mongodb c++驱动程序:如何查询元素的数组
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- MySQL c++ 连接器:使用 SetBlob() 在查询中设置多个 blob 数据的正确方法是什么?
- 查询数据库以在 C++ 中创建自定义类集合的最佳方法
- 在 MySQL 连接器C++ API 中使用一个函数调用执行多个查询的正确方法是什么?
- 检查从查询返回的任何行是否包含在字符串中的最高性能方法?
- 当有多个查询时,检查某些子数组是否排序的有效方法是什么?
- 在QT列表中存储DB的查询结果的更好方法
- C++ 编程(由 ref 和 by val 的优势)查询?/ 编辑 byRef 以外的结构的方法
- MongoDB:查询单个随机文档的最有效方法是什么?
- 可以查询所有继承类的同名方法吗?
- 在运行时查询模板专门化的方法/避免大的切换
- 查询相似句子的有效方法
- 是否有标准的方法来查询EGL错误字符串