拆开 Hical:一套 API 两套实现——C++26 反射双轨是怎么设计的
[Hical] 一套 API,两套实现:C++26 反射双轨是怎么设计的 本专栏文章:拆开 Hical · 第 7 篇(完结篇) 这是系列的最后一篇,也是最"前沿"的一篇——C++26 反射在中文技术社区几乎没有实战文章,因为它太新了。Hical 是目前全网唯二(或许唯一)在 open-source 项目中用 C++26 反射的生产级框架。 但 Hical 等不到所有编译器都支持 P2996——它必须兼容 GCC 14、Clang 20、MSVC 2022。所以它做了一套双轨架构:C++26 原生反射和 C++20 宏 fallback 提供相同的用户 API。 1. 问题:你要 JSON 序列化,但不想每个 struct 手写 to_json/from_json 假设你定义了一个 DTO: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 struct User { std::string name; int age; std::string email; }; // 你想要的: auto json = hical::meta::toJson(user); // → {"name":"张三","age":25,"email":"z3@example.com"} auto user2 = hical::meta::fromJson<User>(json); // 你不想要的: boost::json::object to_json(const User& u) { boost::json::object obj; obj["name"] = u.name; obj["age"] = u.age; obj["email"] = u.email; return obj; } // ↑ 每个 DTO 手写一遍,字段增删时忘了更新序列化 → 静默 bug 传统方案(nlohmann/json)靠宏来自动生成,但需要每个类型手动注册。Hical 的做法是让框架自动发现结构体的字段。 ...