/*************************
*文件名: 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");
}