前言
Java/Go语言都内置了反射机制,支持在运行期获取类/方法/属性的信息。反射机制有很多的应用场景,如最常见数据的序列化,如果没有反射机制,要么是基于代码生成,如protobuf;要么是一行行的手写代码那是纯体力活。
C++并没有内置的一套反射机制,实现反射机制也是C++经常讨论的话题。考虑到C++有强大的元模板编码能力,准确的来说,C++在编译期间是有些自省能力,提供一些is_xxx函数集合以及模板萃取能力,只是不支持动态反射,因为它没有像Java/Go语言拥有运行时环境,且在编译期能力非常孱弱与难用。
C++有不少的开源第三方反射实现库,他们实现方式无外乎二种:
- 编译时反射:在编译时进行类/属性/方法的遍历 ,且遍历支持用户进行过滤,为类/属性/方法提供静态的附加元信息,并把他们保存起来提供运行时API
- 运行时反射:提供一套管理框架,在运行时对类/属性/方法信息进行注册管理,使用时再从框架获取对应的信息
前一段时间定位某一C++写的老产品(20年+)的问题,无意中发现代码中有运行时反射的影子,只是代码并没有把这个反射概念进行提炼,代码比较零散。