C++反射机制实现:结合模板类的实现

本文介绍了如何在C++中利用模板和反射机制实现一个简单易扩展的状态机工厂。通过定义宏ISTATEBASE_META_OBJECT,使得类在注册时只需关注这一宏,减少了额外代码。工厂类CFSMObjectCreator使用模板方法注册和注销对象,并通过单例模式提供全局访问。创建对象时,工厂会根据类名动态创建实例。

背景

最近在实现基础的状态机逻辑,考虑到需要工厂来创建一个指定的状态机,而且调用要简单且可扩展,就想到了反射机制。

以前学习了文章:

https://blog.csdn.net/Scythe666/article/details/51718864

给的思路是通过定义回调函数指针类型的方法来实现的,也就是说反射出的对象需要显式地实现实例类创建的回调函数,然后在全局注册进去,虽然步骤已经很简单了,而且一个宏就搞定注册了。
不过我想要在扩展一个需反射对象时,对外暴露的“注册行为”更少,尽量减少一个对象实现时需要考虑过多的附带代码(毕竟拷贝多了很容易出错);另一个想法就是希望在用户调用注册时,不必在全局中实现,能够在任何地方的代码块中注册。

说到这里,充分考虑C++的各种支持,无疑多态跑不掉,毕竟有工厂的概念,不过为了能够把Create这个步骤交给内部处理,模板就发挥了它的效用了,也就是说,我只需要传类型进去,就可以实现注册了。


达到效果

在介绍实现之前,先放一个最终效果,也就是从用户扩展的角度,如何达到注册+创建的需求。

#include <stdlib.h>
#include <iostream>
#include <QApplication>
#include "../../FSMBase/Include/IStateBase.h"
#include "../../FSMBase/Include/FSMObjectCreator.h"

// IStateBase 就是我需要反射创建对象的基类
// CStateIDEL和CStateIDELNew是我测试扩展的子类对象,实现了两个

class CStateIDEL : public IStateBase
{
   
   
	ISTATEBASE_META_OBJECT("CStateIDEL")

public:
	CStateIDEL() {
   
   }
	virtual ~CStateIDEL() {
   
   }

	/*先省略一些与反射机制无关的接口实现*/
	
public:
	std::string m_strName;
};

class CStateIDELNew : public IStateBase
{
   
   
	ISTATEBASE_META_OBJECT("CStateIDELNew")

public:
	CStateIDELNew() {
   
   }
	virtual ~CStateIDELNew() {
   
   }

	/*先省略一些与反射机制无关的接口实现*/

public:
	std::string m_strName;
};

int main(int argc, char* argv[])
{
   
   
	QApplication app(argc, argv);

	CFSMObjectCreator* pCreator = CFSMObjectCreatorSingleton::GetInstance();

	pCreator->RegisterStateBaseType<CStateIDEL>();     // 注册扩展的 CStateIDEL类
	pCreator->RegisterStateBaseType<CStateIDELNew>();  // 注册扩展的 CStateIDELNew类


	CStateIDEL* pIDEL = dynamic_cast<CStateIDEL*>(pCreator->CreateStateBase("CStateIDEL", "111"));  // 创建 CStateIDE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值