实现只向指定可以转换的类才能进行转换

来源:互联网 发布:建筑设计需要什么软件 编辑:程序博客网 时间:2024/05/16 07:51
/************************* *文件名:    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");}


 

原创粉丝点击