C++模板构建反射

来源:互联网 发布:蒙文打字软件下载 编辑:程序博客网 时间:2024/05/18 06:50
#pragma once#include <map>#include <string>#define DisableCopy(Class) \private: \Class(const Class& obj) {} \Class& operator=(const Class& obj) {}//多参数下创建对象 ----- 复杂反射template<typename ClassType>class CCreateGeneralPool{private://类型大小int m_elem_size;//当前通过内存池分配对象个数int m_alloc_num;//内存回收链表的头ClassType * m_free_list_head;public:CCreateGeneralPool() : m_alloc_num(0), m_free_list_head(NULL){m_elem_size = std::max(sizeof(ClassType), sizeof(ClassType*));            //确保最小分配空间 = 指针类型长度 兼容小对象如char}~CCreateGeneralPool(){while (NULL != m_free_list_head){ClassType* alloc_ret = m_free_list_head;m_free_list_head = *(reinterpret_cast<ClassType**>(m_free_list_head));free(alloc_ret);}}public:ClassType * Create(){++m_alloc_num;if (NULL == m_free_list_head)            //没有对象回收return new(malloc(m_elem_size))ClassType;ClassType* alloc_ret = m_free_list_head;m_free_list_head = *(reinterpret_cast<ClassType**>(m_free_list_head));      //头指针指向下个区块return new(alloc_ret)ClassType;}template<typename T1>ClassType * Create(const T1& t1){++m_alloc_num;if (NULL == m_free_list_head)return new(malloc(m_elem_size))ClassType(t1);ClassType* alloc_ret = m_free_list_head;m_free_list_head = *(reinterpret_cast<ClassType**>(m_free_list_head));return new(alloc_ret)ClassType(t1);}template<typename T1, typename T2>ClassType * Create(const T1& t1, const T2& t2){++m_alloc_num;if (NULL == m_free_list_head)return new(malloc(m_elem_size))ClassType(t1, t2);ClassType* alloc_ret = m_free_list_head;m_free_list_head = *(reinterpret_cast<ClassType**>(m_free_list_head));return new(alloc_ret)ClassType(t1, t2);}template<typename T1, typename T2, typename T3>ClassType * Create(const T1& t1, const T2& t2, const T3& t3){++m_alloc_num;if (NULL == m_free_list_head)return new(malloc(m_elem_size))ClassType(t1, t2, t3);ClassType* alloc_ret = m_free_list_head;m_free_list_head = *(reinterpret_cast<ClassType**>(m_free_list_head));return new(alloc_ret)ClassType(t1, t2, t3);}template<typename T1, typename T2, typename T3, typename T4>ClassType * Create(const T1& t1, const T2& t2, const T3& t3, const T4& t4){++m_alloc_num;if (NULL == m_free_list_head)return new(malloc(m_elem_size))ClassType(t1, t2, t3, t4);ClassType* alloc_ret = m_free_list_head;m_free_list_head = *(reinterpret_cast<ClassType**>(m_free_list_head));return new(alloc_ret)ClassType(t1, t2, t3, t4);}template<typename T1, typename T2, typename T3, typename T4, typename T5>ClassType * Create(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5){++m_alloc_num;if (NULL == m_free_list_head)return new(malloc(m_elem_size))ClassType(t1, t2, t3, t4, t5);ClassType* alloc_ret = m_free_list_head;m_free_list_head = *(reinterpret_cast<ClassType**>(m_free_list_head));return new(alloc_ret)ClassType(t1, t2, t3, t4, t5);}template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>ClassType * Create(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6){++m_alloc_num;if (NULL == m_free_list_head)return new(malloc(m_elem_size))ClassType(t1, t2, t3, t4, t5, t6);ClassType* alloc_ret = m_free_list_head;m_free_list_head = *(reinterpret_cast<ClassType**>(m_free_list_head));return new(alloc_ret)ClassType(t1, t2, t3, t4, t5, t6);}template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>ClassType * Create(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7){++m_alloc_num;if (NULL == m_free_list_head)return new(malloc(m_elem_size))ClassType(t1, t2, t3, t4, t5, t6, t7);ClassType* alloc_ret = m_free_list_head;m_free_list_head = *(reinterpret_cast<ClassType**>(m_free_list_head));return new(alloc_ret)ClassType(t1, t2, t3, t4, t5, t6, t7);}template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>ClassType * Create(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8){++m_alloc_num;if (NULL == m_free_list_head)return new(malloc(m_elem_size))ClassType(t1, t2, t3, t4, t5, t6, t7, t8);ClassType* alloc_ret = m_free_list_head;m_free_list_head = *(reinterpret_cast<ClassType**>(m_free_list_head));return new(alloc_ret)ClassType(t1, t2, t3, t4, t5, t6, t7, t8);}template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>ClassType * Create(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9){++m_alloc_num;if (NULL == m_free_list_head)return new(malloc(m_elem_size))ClassType(t1, t2, t3, t4, t5, t6, t7, t8, t9);ClassType* alloc_ret = m_free_list_head;m_free_list_head = *(reinterpret_cast<ClassType**>(m_free_list_head));return new(alloc_ret)ClassType(t1, t2, t3, t4, t5, t6, t7, t8, t9);}template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>ClassType * Create(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10){++m_alloc_num;if (NULL == m_free_list_head)return new(malloc(m_elem_size))ClassType(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10);ClassType* alloc_ret = m_free_list_head;m_free_list_head = *(reinterpret_cast<ClassType**>(m_free_list_head));return new(alloc_ret)ClassType(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10);}template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>ClassType * Create(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11){++m_alloc_num;if (NULL == m_free_list_head)return new(malloc(m_elem_size))ClassType(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11);ClassType* alloc_ret = m_free_list_head;m_free_list_head = *(reinterpret_cast<ClassType**>(m_free_list_head));return new(alloc_ret)ClassType(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11);}template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>ClassType * Create(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12){++m_alloc_num;if (NULL == m_free_list_head)return new(malloc(m_elem_size))ClassType(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12);ClassType* alloc_ret = m_free_list_head;m_free_list_head = *(reinterpret_cast<ClassType**>(m_free_list_head));return new(alloc_ret)ClassType(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12);}void Free(ClassType * obj){obj->~ClassType();--m_alloc_num;assert(m_alloc_num >= 0);*(reinterpret_cast<ClassType**>(obj)) = m_free_list_head;                //对象回收 未使用内存 逻辑上可强行解释成指向下个区块的指针m_free_list_head = obj;}};//对上面的生成器包一层template <typename ClassType>class CInstanceBasicBuild{public:CInstanceBasicBuild() {}virtual ~CInstanceBasicBuild() {}virtual void Free(ClassType * obj) { }static std::map<ClassType *, std::string > m_instance_class_names;static std::string& GetClassName(ClassType * obj){static std::string class_name;if (NULL != obj){std::map<ClassType *, std::string >::iterator iter = m_instance_class_names.find(obj);if (iter != m_instance_class_names.end())return iter->second;}return class_name;}static void Remove(ClassType * obj){if (NULL != obj){m_instance_class_names.erase(obj);}}};template <typename ClassType> std::map<ClassType *, std::string > CInstanceBasicBuild<ClassType>::m_instance_class_names;template<typename ClassType, typename BassClass>class CInstanceBuilder : public CInstanceBasicBuild<BassClass>{private:CCreateGeneralPool<ClassType> m_instance_builder;public:std::string m_class_name;CInstanceBuilder() { }CInstanceBuilder(const std::string class_name){m_class_name = class_name;}public:BassClass * Create(){BassClass * pInstance = m_instance_builder.Create();m_instance_class_names[pInstance] = m_class_name;return pInstance;}template<typename T1>BassClass * Create(const T1& t1){BassClass * pInstance = m_instance_builder.Create(t1);m_instance_class_names[pInstance] = m_class_name;return pInstance;}template<typename T1, typename T2>BassClass * Create(const T1& t1, const T2& t2){BassClass * pInstance = m_instance_builder.Create(t1, t2);m_instance_class_names[pInstance] = m_class_name;return pInstance;}template<typename T1, typename T2, typename T3>BassClass * Create(const T1& t1, const T2& t2, const T3& t3){BassClass * pInstance = m_instance_builder.Create(t1, t2, t3);m_instance_class_names[pInstance] = m_class_name;return pInstance;}template<typename T1, typename T2, typename T3, typename T4>BassClass * Create(const T1& t1, const T2& t2, const T3& t3, const T4& t4){BassClass * pInstance = m_instance_builder.Create(t1, t2, t3, t4);m_instance_class_names[pInstance] = m_class_name;return pInstance;}template<typename T1, typename T2, typename T3, typename T4, typename T5>BassClass * Create(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5){BassClass * pInstance = m_instance_builder.Create(t1, t2, t3, t4, t5);m_instance_class_names[pInstance] = m_class_name;return pInstance;}template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>BassClass * Create(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6){BassClass * pInstance = m_instance_builder.Create(t1, t2, t3, t4, t5, t6);m_instance_class_names[pInstance] = m_class_name;return pInstance;}template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>BassClass * Create(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7){BassClass * pInstance = m_instance_builder.Create(t1, t2, t3, t4, t5, t6, t7);m_instance_class_names[pInstance] = m_class_name;return pInstance;}template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>BassClass * Create(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8){BassClass * pInstance = m_instance_builder.Create(t1, t2, t3, t4, t5, t6, t7, t8);m_instance_class_names[pInstance] = m_class_name;return pInstance;}template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>BassClass * Create(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9){BassClass * pInstance = m_instance_builder.Create(t1, t2, t3, t4, t5, t6, t7, t8, t9);m_instance_class_names[pInstance] = m_class_name;return pInstance;}template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>BassClass * Create(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10){BassClass * pInstance = m_instance_builder.Create(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10);m_instance_class_names[pInstance] = m_class_name;return pInstance;}template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>BassClass * Create(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11){BassClass * pInstance = m_instance_builder.Create(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11);m_instance_class_names[pInstance] = m_class_name;return pInstance;}template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>BassClass * Create(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12){BassClass * pInstance = m_instance_builder.Create(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12);m_instance_class_names[pInstance] = m_class_name;return pInstance;}void FreeObj(ClassType * obj){m_instance_builder.Free(obj);}static CInstanceBuilder * Cast(CInstanceBasicBuild<BassClass> * obj){return (CInstanceBuilder*)obj;}void Free(BassClass * obj){if (NULL != obj){CInstanceBasicBuild<BassClass>::Remove(obj);FreeObj((ClassType*)obj);}}};//具体创建器template<typename BasicClass>class CInstanceBuildFactory{private:CInstanceBuildFactory() {}~CInstanceBuildFactory() {}DisableCopy(CInstanceBuildFactory)public:static CInstanceBuildFactory& GetInstance(){static CInstanceBuildFactory obj;return obj;}public:void SetBuilder(const std::string& class_name, CInstanceBasicBuild<BasicClass>* builder){m_builders[class_name] = builder;}CInstanceBasicBuild<BasicClass>* GetBuilder(const std::string& class_name){std::map<std::string, CInstanceBasicBuild<BasicClass>* >::iterator iter = m_builders.find(class_name);if (iter != m_builders.end())return iter->second;return NULL;}//解析对象template<typename T>void Delete(T * obj){CInstanceBasicBuild<BasicClass>* pBuilder = GetBuilder(CInstanceBasicBuild<BasicClass>::GetClassName(obj));if (NULL != pBuilder){pBuilder->Free(obj);}}private://!真正的生发对象std::map<std::string, CInstanceBasicBuild<BasicClass>* > m_builders;};template<typename Class, typename BasicClass>class CGetInstanceBuilder{public://得到创建器基类static CInstanceBasicBuild<BasicClass>* GetBuilder(const std::string& class_name){CInstanceBasicBuild<BasicClass>* pBuilder = CInstanceBuildFactory<BasicClass>::GetInstance().GetBuilder(class_name);if (NULL == pBuilder){pBuilder = new CInstanceBuilder<Class, BasicClass>(class_name);CInstanceBuildFactory<BasicClass>::GetInstance().SetBuilder(class_name, pBuilder);}return pBuilder;}//得到具体创建器static CInstanceBuilder<Class, BasicClass> * GetInstanceBuilder(const std::string& class_name){CInstanceBasicBuild<BasicClass>* pBuilder = GetBuilder(class_name);if (NULL != pBuilder){CInstanceBuilder<Class, BasicClass> * pInstanceBuilder = CInstanceBuilder<Class, BasicClass>::Cast(pBuilder);return pInstanceBuilder;}return NULL;}};//接口宏 用宏1创建的对象 必须用宏2进行删除//获取对象create器具#define GETINSTANCEBUILDER(Class, BasicClass) \CGetInstanceBuilder<Class, BasicClass>::GetInstanceBuilder(#Class)//释放对象#define DELETEINSTANCE(BasicClass , pInstance) \CInstanceBuildFactory<BasicClass>::GetInstance().Delete(pInstance);