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

实现只向指定可以转换的类才能进行转换
/************************* 
*文件名:    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");
}