C++实现反射

前言

首先,C++不同于C#或者Java,没有自带反射机制,只能通过C++一些传统艺能变着法地实现。

有哪些反射

1、类对象反射:简单地说就是程序运行时读进来一个字符串,然后程序就会自动创建出字符串对应名字的类对象

2、类属性反射:能够遍历得到类的所有成员,知道它们的数据类型和名字。最实际的例子就是Unreal和Unity中UI的实现,当定义一个类成员变量时,它就能在UI中显示出来。而不需要费事地再去针对新增的变量写UI代码,让它显示在界面上。

3、函数反射:能够自动搜集函数的相关的所有信息,包括名称,参数个数,参数类型,返回值。

类对象反射

其实用工厂模式就能轻松解决这个问题。解决这个问题的思路是

1、首先,创建对象的接口要方便,最好统一成一个,也就是说类似下面这个接口。无论什么对象,只要传个名字就能返回对象指针。

static Object* CreateObject(std::string className)

2、由于返回的是同样类型的指针,那么就必须继承相同的基类,也就是Object。

3、然后要怎么根据名字创建对象呢?就需要用到工厂模式了,用一个map存储工厂类,然后工厂类去创建对象

class ObjectFactory
{
public:
	virtual Object* CreateObject() = 0;
};

template<class T>
class ObjectFactoryImp :public ObjectFactory
{
public:
	virtual Object* CreateObject()
	{
		return new T();
	}
};

std::map<std::string, ObjectFactory*> factoryMap;

4、也就是说我们需要去构造factoryMap,当调用CreateObject时,实际是调用factoryMap[className]->CreateObject(); 构造的方法也很简单,也就是每个类定义的时候,也进行一次初始化,初始化要做的事情就是注册一个工厂类。

template<class T>
void RegisterObject(std::string className)
{
	ObjectFactory* factory = new ObjectFactoryImp<T>();
	if (factoryMap.count(className) == 0)
	{
		factoryMap[className] = factory;
	}
    else
    {
	    delete factory;
    }
}

// 使用方式
RegisterObject<类名>(类名对应字符串);

5、以上就是类反射实现的所有内容,用法也很简单,先调用RegisterObject去注册对象,然后直接调用CreateObject创建对象就行了。我在此基础上做了简单的封装,感兴趣的可以下载看看https://download.csdn.net/download/a497406594/12099078

 

类属性反射

https://zhuanlan.zhihu.com/p/88144082 这篇文章有提到怎么实现,个人是比较倾向于静态反射的,不过老实说用了太多语法糖就不香了,可读性较差。个人是比较推荐这本书的作者用的方式,知识点在第八章。https://zhuanlan.zhihu.com/p/54166550。这部分比较难,并且它这个牵扯的比较多,因为这本书的作者还想顺便实现UI的反射。

如果只是想实现属性反射的话,我按照自己的理解整理了下,至少需要做以下工作

1、定义一个属性类,至少包含属性数据类型,名字,在类中的偏移

2、要实现属性反射的类中需要定义一个静态成员队列,用来存储属性对象,每个属性对应队列里一个元素。这个队列记录在另外的一个单例类里,因为涉及继承,以及是静态的,所以不可能放自己的类里。最好是用一个通用的类,类似上面类反射一样放在全局里,或者某个静态类或单例里。

3、需要像类对象反射一样,先对每个属性进行注册,也就是不得不.h声明完变量之后,又在cpp里再写一遍类似声明的东西。所谓注册,就是创建属性对象加到类的队列里。这一步可以用宏包装下,可以减少一定的代码量

我简单实现了下,感兴趣的可以下载看看https://download.csdn.net/download/a497406594/12100744

函数反射

https://zhuanlan.zhihu.com/p/54166550 这本书依旧有这个知识点,我还不会就先Mark一下吧

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值