Reflection(反射)
ll/api/reflection/ · 通用
概述
Reflection 模块为聚合类型提供编译期反射,支持自动序列化/反序列化到 JSON,无需手动编写代码。
头文件
| 头文件 |
说明 |
ll/api/reflection/Reflection.h |
核心反射工具 |
ll/api/reflection/Serialization.h |
JSON 序列化 |
ll/api/reflection/Deserialization.h |
JSON 反序列化 |
核心概念
Reflectable
如果类型是聚合体(无用户定义构造函数、无私有成员、无虚函数),则该类型可反射。
| C++ |
|---|
| namespace ll::reflection {
template <class T>
concept Reflectable = /* 聚合类型 */;
}
|
核心函数
| C++ |
|---|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 | namespace ll::reflection {
// 迭代成员
template <class T, class F>
void forEachMember(T& value, F&& fn);
// 序列化为 JSON
template <class J, Reflectable T>
Expected<J> serialize(T const& value);
// 从 JSON 反序列化
template <Reflectable T, class J>
Expected<T> deserialize(J const& json);
// 成员内省
template <class T>
constexpr size_t member_count_v;
template <size_t I, class T>
using member_t = /* 第 I 个成员的类型 */;
template <size_t I, class T>
constexpr size_t member_offset_v;
template <class T>
constexpr auto member_name_array_v;
}
|
使用方法
基本序列化
| C++ |
|---|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | #include "ll/api/reflection/Serialization.h"
#include "nlohmann/json.hpp"
struct PlayerData {
std::string name;
int level;
double health;
};
void savePlayer(PlayerData const& player) {
auto json = ll::reflection::serialize<nlohmann::json>(player);
if (json) {
// json.value() == {"name": "...", "level": 10, "health": 20.0}
}
}
|
基本反序列化
| C++ |
|---|
| #include "ll/api/reflection/Deserialization.h"
void loadPlayer(nlohmann::json const& json) {
auto player = ll::reflection::deserialize<PlayerData>(json);
if (player) {
// 使用 player.value()
}
}
|
成员迭代
| C++ |
|---|
| #include "ll/api/reflection/Reflection.h"
void printMembers(PlayerData const& player) {
ll::reflection::forEachMember(player, [](auto const& member) {
// 处理每个成员
});
}
|
相关模块