听到反射机制,大家第一时间想到java语言。
我不是写java的,但问过相关的同事,大家都说反射机制在java中使用的非常广泛。
java的反射机制是语言级别的,得益于字节码,编译过程中生成额外的信息能保留下来,
也就是牺牲了部分空间来换取可扩展性,这是很值得去做的。
反过来看C++,虽然网上也有很多反射机制实现的方法,但毕竟不是语言级别的,
所以顶多算模拟,还用的非常不爽。
有人说,C++的RTTI(Runtime Type Information)也有点味道,
但由于包含的信息量太少,所以顶多做做cast的动作,做反射是不可能的。
很多时候,C++也是需要反射机制的,所以简单模拟一下也是有需要的。
譬如做新执行器的时候,就遇到好几个情况,需要根据类名称来构造类对象。
当然,java的反射除了类对象,还可以是类的成员变量和成员方法的,但对我来说,类对象就足够了。
先简单说说最菜的做法是如何的:
上面的例子很容易明白,无非就是使用了if-else做了个类名称到类实例的映射而已。
为什么说这个方法菜呢?
显然嘛,完全暴露了类型A、类型B的东西了(相应的h文件总要导入吧?)
头文件依赖是一个很严重的问题的。
而且,类型的新增和修改,都意味着相应代码的修改,麻烦啊。
所以,我们希望有一个解耦的方案代替。没错,就是函数指针!
其实简单的反射机制在C++中可以通过函数指针实现。
具体代码就不写了,大概原理是,在类中实现一个static函数,返回一个new出来的类型。
使用一个映射关系的数据结构,如map或hash,将字符串和函数指针一对一的关联起来,
这样,提供一个字符串,就能找到一个函数指针,通过该函数指针,就能生成一个对于类的对象!
这个方法挺简单的,但方便实用,代码也挺优雅的。
其实很多java的语言特性,我们都可以使用C++来模拟,做到简单够用,就是最好的。
关于C++实现反射机制更详细资料,可参考:
http://www.garret.ru/cppreflection/docs/reflect.html
btw,设计模式中的prototype模式,能基于多态实现clone函数来获取对象实例,
但这是有前提的,就是必须有一个现成的实例,如通过new来获得,无中生有是做不到的。