magic_enum库在MSVC下实现enum_name的原理咨询及相关问题
magic_enum在MSVC下实现enum_name的核心方式
magic_enum在MSVC下并未依赖__FUNCSIG__,而是通过以下关键逻辑实现枚举值到名称的转换:
利用C++17
auto非类型模板参数保留枚举名
magic_enum使用auto类型的非类型模板参数接收枚举值(如magic_enum::enum_name<Dummy::first>()),而非将枚举值转换为底层数值作为模板参数。在MSVC中,这种写法会让__PRETTY_FUNCTION__的输出保留枚举值的完整名称(例如constexpr std::string_view __cdecl magic_enum::detail::enum_name_v<Dummy::first>(void)),避免了传统模板参数写法中枚举值被替换为数值的问题。针对MSVC的编译期函数签名解析
magic_enum针对MSVC的__PRETTY_FUNCTION__输出格式编写了专属编译期字符串解析逻辑:- 定位签名中的模板参数片段(如
<Dummy::first>) - 剥离枚举类型前缀(如
Dummy::),提取出纯枚举值名称(如first) - 适配不同MSVC版本的签名格式差异,保证解析逻辑的稳定性
- 定位签名中的模板参数片段(如
旧版MSVC的兼容 fallback 机制
对于不支持C++17auto非类型模板参数的旧版MSVC,magic_enum会通过模板元编程遍历枚举的所有可能值范围,结合预处理器生成的枚举名称映射表,在编译期完成数值与名称的匹配转换。
内容的提问来源于stack exchange,提问作者Oersted
相关产品推荐
相关产品推荐

