TTCN3新执行器系列-实现简单的反射机制

本文探讨了在C++中实现类似Java反射机制的方法,通过使用函数指针简化类名称到类实例的映射,避免了类型依赖和代码维护的麻烦。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

听到反射机制,大家第一时间想到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来获得,无中生有是做不到的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值