简单的cpp反射

头文件

#pragma once
#ifndef dtReflection_H
#define dtReflection_H

#include "dtMarco.h"
//https://blog.youkuaiyun.com/scythe666/article/details/51718864

class dtData;
typedef void* (*dtPTR_CreateObject)(void);
typedef void* (*dtPTR_CreateObject_id)(dtID);

class dtReflection
{
private:
	map<string, dtPTR_CreateObject> m_classMap;
	map<string, dtPTR_CreateObject_id> m_classMap_id;
	dtReflection() {}; //构造函数私有化

public:
	dtData * create(const string& className);
	dtData * create(const string& className, dtID id);
	
	//检测当前类型是否定义reflection_data
	bool  check_is_define_reflection_data(const string& className);

	void registClass(string name, dtPTR_CreateObject method);
	void registClass(string name, dtPTR_CreateObject_id method);

	static dtReflection& instance();
};

class DATA_CENTER_API dtRegisterAction
{
public:
	dtRegisterAction(string className, dtPTR_CreateObject ptrCreateFn)
	{
		dtReflection::instance().registClass(className, ptrCreateFn);
	}

	dtRegisterAction(string className, dtPTR_CreateObject_id ptrCreateFn)
	{
		dtReflection::instance().registClass(className, ptrCreateFn);
	}
};

//要放在cpp内
#define reflection_data(CLASS)\
CLASS* objectCreator##CLASS(){return new CLASS;}\
dtRegisterAction g_creatorRegister##CLASS(#CLASS, (dtPTR_CreateObject)objectCreator##CLASS);\
CLASS* objectCreator##CLASS##_id(dtID id){return new CLASS(id);}\
dtRegisterAction g_creatorRegister##CLASS##_id(#CLASS, (dtPTR_CreateObject_id)objectCreator##CLASS##_id);

#endif

cpp文件

#include "stdafx.h"
#include "dtReflection.h"

dtData* dtReflection::create(const string& className)
{
	map<string, dtPTR_CreateObject>::const_iterator iter;
	iter = m_classMap.find(className);
	if (iter == m_classMap.end())
		return nullptr;
	else
		return (dtData*)iter->second();
}

dtData * dtReflection::create(const string& className, dtID id)
{
	map<string, dtPTR_CreateObject_id>::const_iterator iter;
	iter = m_classMap_id.find(className);
	if (iter == m_classMap_id.end())
	{
		return nullptr;
	}
	else
	{
		return (dtData*)iter->second(id);
	}

	return nullptr;
}

bool dtReflection::check_is_define_reflection_data(const string& className)
{
	map<string, dtPTR_CreateObject>::const_iterator iter;
	iter = m_classMap.find(className);
	return iter != m_classMap.end();
}

void dtReflection::registClass(string name, dtPTR_CreateObject method)
{
	m_classMap.insert(std::pair<string, dtPTR_CreateObject>(name, method));
}

void dtReflection::registClass(string name, dtPTR_CreateObject_id method)
{
	m_classMap_id.insert(std::pair<string, dtPTR_CreateObject_id>(name, method));
}

dtReflection& dtReflection::instance()
{
	static dtReflection sLo_factory;
	return sLo_factory;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值