You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 08:53:09