讲师中心 微信公众号

工具推荐

视频效率加速
AniShort
AniShort

AI短剧协同制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

updream

一键生成高质量推广成片

Seko
Seko

AI短剧一键生成成片

C++怎么用反射机制 C++利用宏实现简单反射【高级】

梦墨同学_5719

梦墨同学_5719

发布时间:2026-03-01 12:25:29

|

620人浏览过

|

来源于php中文网

原创

C++无原生反射,所谓“反射”实为宏+模板+手动注册的工程折衷,依赖显式配合,漏写即失效;REFLECTABLE宏需用__LINE__生成唯一标识、成员名须为字符串字面量,避免ODR违规与模板推导失败。

c++怎么用反射机制 c++利用宏实现简单反射【高级】

为什么C++没有原生反射,但你还在搜reflection

因为C++标准至今(C++20/23)确实不支持运行时类型信息(RTTI)以外的反射能力——typeid和dynamic_cast只能告诉你“是不是某种类型”,不能列出成员变量、调用私有函数、序列化任意对象。所谓“C++反射”,全是宏+模板+手动注册拼出来的模拟行为,不是语言特性,是工程折衷。

这意味着:你写不出像Python getattr(obj, 'x')那样通用的代码;所有“反射”功能都依赖你在定义类时显式配合,漏写一个宏,那个类就彻底不可反射。

REFLECTABLE宏怎么写才不崩在模板推导上

常见错误是把宏展开成模板特化或静态成员,结果遇到模板参数未完全推导、ODR违规、头文件重复包含时链接失败。核心矛盾在于:宏必须生成唯一标识符,且不能依赖未定义行为。

  • 用__LINE__或__COUNTER__生成局部唯一符号,避免跨文件冲突:REFLECTABLE(x, y, z) 展开为 struct ReflectInfo_123 { ... }
  • 禁止在宏里直接写static_assert或constexpr if,C++17前这些在宏展开时机可能尚未可见
  • 成员名必须字符串字面量("x"),不能用std::string——后者无法进常量表达式,会导致编译期元数据构建失败
  • 示例安全写法:
    #define REFLECTABLE(...) \
        static constexpr auto reflect_members = std::make_tuple(__VA_ARGS__); \
        template<size_t I> using member_type = decltype(std::get<I>(reflect_members));

用BOOST_FUSION_DEFINE_STRUCT还是自己写宏

Boost.Fusion提供BOOST_FUSION_DEFINE_STRUCT,但它要求所有字段公开、无构造函数、无继承,且会污染全局命名空间(生成fusion::adapt_struct特化)。自己写宏更可控,但得亲手处理三类边界:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

立即学习“C++免费学习笔记(深入)”;

  • 带const/volatile限定符的字段:宏需识别const int x;并保留const语义,否则序列化时读出值却无法赋回
  • 数组字段如int arr[4];:不能简单当int*处理,必须保留长度信息,否则sizeof计算和遍历越界
  • 嵌套结构体字段:若子类没加REFLECTABLE宏,父类反射遍历时会卡死在未知类型上,建议运行时加if constexpr (has_reflect_info_v<t>)</t>跳过

调试时error: ‘reflect_members’ is not a member of ‘MyClass’怎么快速定位

这类错误90%是因为宏没在类定义内部调用,或调用位置在private:之后但宏生成了public成员。C++对宏展开位置极其敏感——它不是函数,不跨访问控制域。

  • 检查宏是否紧贴在class MyClass {大括号后第一行,且前面没其他语句(包括注释)
  • 确认编译器版本:GCC 11+、Clang 14+才稳定支持__VA_OPT__处理空参宏,旧版本遇到REFLECTABLE()(零字段)会直接报错
  • 临时加一句static_assert(std::is_same_v<decltype int>, "no reflect");</decltype>,编译失败时能准确定位到哪个类漏了宏
  • 别信IDE的语法高亮——它常把宏展开结果标成灰色,实际编译器看到的是另一套符号,以命令行g++ -E预处理输出为准

真正麻烦的从来不是写宏,而是让10个不同团队维护的200个类,全部按同一套宏规则补全、且每次加字段都记得同步更新反射声明。没人会为这事写单元测试,但线上序列化崩溃时,你得翻三天git log找谁删了一行REFLECTABLE。

热门AI工具

更多
立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7519

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6384

2023.10.24

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1069

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3520

2023.10.25

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

18020

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1263

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

9650

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

3842

2025.08.07

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn