MSVC 19中consteval函数内获取type_info及name的报错解决咨询
在MSVC 19的consteval函数中获取类型名的解决方案
首先明确:标准C++中,typeid(T).name()返回的字符串指针并不被要求是编译期常量,MSVC 19里这个值是运行时生成的,所以在consteval函数里直接调用会触发编译错误——因为consteval要求整个函数必须在编译期完成求值,而运行时生成的指针无法满足这个要求。
针对MSVC环境,有两种可行的解决方式:
1. 使用MSVC专属扩展__type_name
MSVC提供了__type_name(T)这个编译期扩展,它能直接生成类型T的名字字符串,且结果是编译期常量,可以在consteval函数中安全使用:
class CChTest { public: static consteval const char* test() { const char* ChReturn = __type_name(CChTest); // ... 其他编译期逻辑 return ChReturn; } };
这个扩展返回的类型名格式和typeid(T).name()一致(比如对于CChTest会返回class CChTest),完全能替代原需求。
2. 编译期硬编码或模板元编程(通用标准方案)
如果需要跨编译器兼容,可以手动在编译期提供类型名字符串:
- 最简单的方式是直接硬编码类型名:
return "CChTest";,但缺点是需要手动维护,类型改名时容易出错。 - 利用模板元编程实现编译期类型名映射,比如定义一个模板类特化来关联类型和其名字:
template<typename T> struct TypeName; template<> struct TypeName<CChTest> { static consteval const char* get() { return "CChTest"; } }; class CChTest { public: static consteval const char* test() { const char* ChReturn = TypeName<CChTest>::get(); // ... 其他编译期逻辑 return ChReturn; } };
这种方式完全符合标准C++,但需要为每个需要获取名字的类型编写特化代码,适合需要跨编译器的场景。
内容的提问来源于stack exchange,提问作者VeNToR
相关产品推荐
相关产品推荐

