C++ reflection/反射

1. 先看一下什么叫reflecton

wiki上的定义: In computer science, reflection is the ability of a process to examine, introspect, and modify its own structure and behavior.

简单地说,就是可以通过名字调用函数,访问对象。而我们有一个对象,可以反推出其类型、成员/方法、成员/方法的类型。

很多编程语言都与该特性,如Java、Python

Method method = foo.getClass().getMethod("doSomething", null);
method.invoke(foo, null);

这里有简单明了的解释。

2. C++为什么没有reflection

我的理解:reflection 需要编译时保存类型定义信息,即使一个类型只定义而没有使用,这将导致编译后的文件过大,执行速度变慢,与C++的设计理念不符。

stackoverflow上大佬说:

  •   不是C++委员会工作的优先事项,还有其他更高优先级的事情要做;
  •   大多数时候C++不需要使用refection, 不需要为不用的东西付出代价
  •   编译器需要保存所有定义的类型信息...
  •   考虑C++中的模板, 每个特例都是一个单独类型, 有时候模板类知道用到的时候才特例化,可能在运行的时候不存在

3. C++有哪些实现refection的方法

即使C++语言标准不支持refection,也有一些tricky的方法能实现refection

如:

https://gracicot.github.io/reflection/2018/04/03/reflection-present.html
https://github.com/apolukhin/magic_get

4. 应用举例

获取自定义结构体的字段个数

template <class T, std::size_t I0, std::size_t... I>
constexpr auto detect_fields_count(std::size_t& out, std::index_sequence<I0, I...>)
    -> decltype( T{ ubiq_constructor<I0>{}, ubiq_constructor<I>{}... } )
{ out = sizeof...(I) + 1;      /*...*/ }

template <class T, std::size_t... I>
constexpr void detect_fields_count(std::size_t& out, std::index_sequence<I...>) {
    detect_fields_count<T>(out, std::make_index_sequence<sizeof...(I) - 1>{});
}

C++ 有关键字std::typeid 操作符可以获取一个(表达式)类型的信息。

Ref:

https://en.wikipedia.org/wiki/Reflection_(computer_programming)

https://www.quora.com/What-does-reflection-in-a-programming-language-mean-in-simple-words

https://stackoverflow.com/questions/359237/why-does-c-not-have-reflection/359462

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ 本身没有内置的反射机制,但可以通过一些技术手段实现类似的功能,称为 C++ 反射C++ 反射是指在运行时获取和操作类型信息的能力。通过反射,可以在运行时查询类的成员、调用方法、访问属性等。 下面介绍几种常见的实现 C++ 反射的方法: 1. 使用宏(macros):通过宏定义来生成代码,使得类的信息在编译时就可以得到。该方法通常需要手动编写宏,并且在每个需要反射的类中添加相应的宏定义。 2. 使用模板元编程(template metaprogramming):利用 C++ 的模板特性和编译期计算能力,通过模板实现类的信息提取和操作。这种方法通常需要编写复杂的模板代码,并且对于复杂的类型和操作可能不够灵活。 3. 使用第三方库:有一些第三方库提供了完善的反射机制,例如 Boost.Reflection、Qt 的元对象系统(Meta-Object System)等。这些库提供了更高级的功能和更方便的接口,可以简化反射的实现和使用过程。 无论使用哪种方法,实现 C++ 反射都需要对类的结构和成员进行解析和存储,以便在运行时进行查询和操作。这通常需要额外的代码和数据结构,因此在选择使用反射时需要权衡代码复杂性和功能需求。 需要注意的是,C++ 反射可能会引入一定的性能开销和代码复杂性。在设计和使用反射时,需要考虑其对性能和代码可维护性的影响,并确保反射的使用是必要且合适的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值