在 C++ 中实现反射的一种简易方案

背景

众所周知,C++并没有像许多语言(例如 C# 或者 Java)那样的反射(Reflection)机制,也没有类似于 Rust 的所谓过程宏(Procedural Macro)来间接实现类似的效果。虽然说大部分场景并不会涉及到类似的需求,但是一旦涉及到就非常令人头大。在这些场景下,往往需要依赖工具提供的额外支持,或者极其复杂的宏机制来达到这样的效果,案例包括 Qt 中的反射和 GDExtension 的 GDOBJECT。

这里给出一种比较简单的、不依赖于额外工具的侵入式反射实现。

简略起见(其实是因为我只做了这些),这里主要介绍类的成员和方法的反射。

对于类成员变量

这里主要讨论 const MemberTypeMemberType 的普通的成员变量。static MemberType 不在讨论的范畴内。

对于 ClassType 类的 member 成员,我们可以通过 &ClassType::member 来获得成员变量的指针,其类型为 ClassType::MemberType*

我们可以使用一个自动推导类型模板参数(C++17 引入)传入这个指针。接着,用 decltype() 拿到他的类型。

1
2
3
4
template <auto Member>
void register_member(const string& name) {
using MemberTypeFull = decltype(Member);
}

累了先不写了,改天续上。


在 C++ 中实现反射的一种简易方案
https://lizi.moe/2025/03/19/在-C-中实现反射的一种简易方案/
作者
李萌
发布于
2025年3月19日
许可协议