C++如何实现简单的反射机制_C++利用宏或模板模拟反射功能【高级】-C++

C++原生不支持反射因标准未引入编译期/运行时完整类型信息,仅提供有限RTTI;__PRETTY_FUNCTION__和宏通过编译期展开模拟字段枚举与类型名提取,支撑序列化等场景,但需手动同步、不支持动态类型与嵌套递归。

为什么C++原生不支持反射,但__PRETTY_FUNCTION__和宏能凑合用?

C++标准至今没引入运行时类型信息(RTTI)以外的反射能力,typeid和dynamic_cast只能解决最基础的类型识别,没法获取成员名、字段偏移或自动遍历结构体。所以实际中常用编译期技巧“模拟”:靠__PRETTY_FUNCTION__在gcc/clang里提取函数签名中的类型名,或用宏把字段声明和元信息一起登记。这些不是真反射,但足够支撑序列化、调试打印、简单配置绑定等场景。

关键限制在于——所有信息必须在编译期可见,不能动态加载新类型;一旦类型定义变更,宏注册部分必须同步改,否则static_assert会炸或行为未定义。

用宏注册结构体字段并生成to_json()的最小可行方案

核心思路是让每个结构体显式声明自己的字段表,宏负责展开成初始化列表和访问器。比如:

#define REFLECT_STRUCT(Name, ...) \
    struct Name##_reflect { \
        static constexpr auto fields() { return std::make_tuple(__VA_ARGS__); } \
    }; \
    template struct reflector : Name##_reflect {};

#define FIELD(name) std::make_pair(#name, &Name::name)

配合一个泛型to_json模板,遍历reflector::fields()里的std::pair,就能逐个取值拼JSON。注意三点:

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

  • __VA_ARGS__里每个FIELD(x)必须严格对应结构体真实公有成员,私有成员无法通过指针访问
  • 字段顺序影响JSON键序,宏展开后不可逆,调试时看预处理输出(g++ -E)最靠谱
  • 不支持嵌套结构体自动递归,得手动为子类型也写REFLECT_STRUCT

模板+特化实现类型名字符串化,比typeid(T).name()可靠

typeid(T).name()返回的是编译器特定的mangled名,abi::__cxa_demangle又依赖libstdc++,跨平台易崩。更稳的方式是模板特化:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C++如何实现简单的反射机制_C++利用宏或模板模拟反射功能【高级】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4003943+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4003943+
  • 本周更新: 0+
  • 最后更新: 2026-03-16