头文件
#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;
}