兑现只向指定可以转换的类才能进行转换
实现只向指定可以转换的类才能进行转换
/************************* *文件名: ReflectClass.h *作者: Clark/陈泽丹 *时间: 20120726 *描述: 反射类 由于C++是编译型语言,目前还无法做到 执行期的模版对象(不像脚本,可以在执行才确定对象)。 所以使用时,转换目标还是需要硬编码。 此类的功能在于转换类型的范围缩小。 dynamic_cast;static_cast;这些是依据语法进行转换的。 而本类是依据实际值进行转换(只有向实际生成的类型才可进行转换)。 ************************/ #pragma once #define DECLARE_REFLECT_CLASS virtual int GetClassID() const = 0; template<class _T_BASE, int _T_ID> struct UserClass: public _T_BASE { enum { ID = _T_ID, }; virtual int GetClassID() const { return ID; } }; template<class _T_DEST> class ToClass { public: template<class _BASS> _T_DEST* operator()(_BASS* _pBase) const { if( _pBase->GetClassID() == _T_DEST::ID) return (_T_DEST*)_pBase; return NULL; } template<class _BASS> const _T_DEST* operator()(const _BASS* _pBase) const { if( _pBase->GetClassID() == _T_DEST::ID) return (_T_DEST*)_pBase; return NULL; } };
#include <vld.h> #include <iostream> #include <assert.h> #include "ReflectClass.h" using namespace std; struct Base { DECLARE_REFLECT_CLASS; }; struct A: public UserClass<Base, 1> { void show(){ cout<<"A"<<endl; } }; struct B: public UserClass<Base, 2> { void show(){ cout<<"B"<<endl; } }; template<int val> struct User; template<> struct User<3>: public UserClass<Base, 3> { void show(){ cout<<"UserClass3"<<endl; } }; template<> struct User<4>: public UserClass<Base, 4> { void show(){ cout<<"UserClass4"<<endl; } }; void main() { Base* pBase = new A(); A* pA = ToClass<A>()(pBase); assert(NULL != pA); pA->show(); delete pA; Base* pBase1 = new User<3>(); User<3>* pU = ToClass< User<3> >()(pBase1); assert(NULL != pU); pU->show(); delete pU; system("pause"); }