テンプレートの実装


/********************************************************************
	created:	2011/11/13
	file base:	define
	file ext:	h
	author:		Clark/ 
	purpose:	
*********************************************************************/
#ifndef __TASK_DEFINE_H__
#define __TASK_DEFINE_H__


struct IEvent{};
struct STimerTrig{};
struct SMonsterMoveTrig{};

#endif //__TASK_DEFINE_H__
/********************************************************************
	created:	2011/11/13
	file base:	CLK
	file ext:	h
	author:		Clark/ 
	purpose:	
*********************************************************************/

#pragma once
#include <tchar.h>
#include <Windows.h>
#include "define.h"

namespace CLK
{
	// CLK 
	class BaseCLK
	{
	public:
		static BOOL Init();
		static void UnInit();
	};

	// 
	class Trace
	{
	public:
		static void Print(const TCHAR* pText);
	};

	// 
	template<DWORD v>  
	class Dword2Type  
	{  
	public:
		enum {VALUE = v};  
	};
}


#include "CLK.h"
#include <iostream>

using namespace std;

BOOL CLK::BaseCLK::Init()
{
	setlocale(LC_ALL,"chs"); 
	return TRUE; 
}
void CLK::BaseCLK::UnInit(){}


void CLK::Trace::Print(const TCHAR* pText)
{
	_tprintf(pText);
}

//------------------------------------------------------------------------------------------------------------------------
 
/********************************************************************
	created:	2011/11/13
	file base:	Trigger
	file ext:	h
	author:		Clark/ 
	purpose:	 
*********************************************************************/
#ifndef __TRIGGER_H__
#define __TRIGGER_H__
#include "..//CLK.h"



class Trigger
{
public:
	//    
	template<class T>  
	BOOL Create(T* pDate)  
	{  
		CreateTrig<T> createTrig;  
		return createTrig(this, pDate);  
	}  

	// , LUA 
	virtual void OnTrigger() = 0;

	// , 
	virtual void Release(){ delete this; }

protected:
	Trigger(){}
	virtual ~Trigger(){}

private:
	template<class T>  
	class CreateTrig
	{
	public:
		BOOL operator()(Trigger* pTrigger, T* pDate)
		{
			CLK::Trace::Print(TEXT(" 
")); return FALSE; } }; }; template<class T> class TriggerEx:public Trigger{ void OnTrigger(){} }; #endif //__TRIGGER_H__

 
/********************************************************************
	created:	2011/11/13
	file base:	TimerTrig
	file ext:	h
	author:		Clark/ 
	purpose:	 
*********************************************************************/
#ifndef __TIME_TRIGGER_H__
#define __TIME_TRIGGER_H__
#include "..//Trigger.h"



template<>  
class Trigger::CreateTrig<STimerTrig>
{
public:
	BOOL operator()(Trigger* pTrigger, STimerTrig* pDate)
	{
		CLK::Trace::Print(TEXT("STimerTrig 
")); TriggerEx<STimerTrig>* pTimerTrig = dynamic_cast<TriggerEx<STimerTrig>*>(pTrigger); pTimerTrig->OnTimer(0); return TRUE; } }; template<> class TriggerEx<STimerTrig>: public Trigger { public: TriggerEx(); virtual ~TriggerEx(); // , LUA // : LUA ,LUA , virtual void OnTrigger(); private: // virtual void OnTimer(DWORD dwTimerID) { if( TIMER_ID == dwTimerID){ OnTrigger();} } private: enum { TIMER_ID }; friend CreateTrig<STimerTrig>; }; #endif //__TIME_TRIGGER_H__

 
#include "TimerTrig.h"

TriggerEx<STimerTrig>::TriggerEx(){}
TriggerEx<STimerTrig>::~TriggerEx(){}
void TriggerEx<STimerTrig>::OnTrigger()
{
	CLK::Trace::Print(TEXT("TimerTrig , Lua 
")); }

 
/********************************************************************
	created:	2011/11/13
	file base:	TimerTrig
	file ext:	h
	author:		Clark/ 
	purpose:	 
*********************************************************************/
#ifndef __MONSTER_MOVE_TRIGGER_H__
#define __MONSTER_MOVE_TRIGGER_H__
#include "..//Trigger.h"



template<>  
class Trigger::CreateTrig<SMonsterMoveTrig>
{
public:
	BOOL operator()(Trigger* pTrigger, SMonsterMoveTrig* pDate)
	{
		CLK::Trace::Print(TEXT("SMonsterMoveTrig 
")); TriggerEx<SMonsterMoveTrig>* pMonsterMoveTrig = dynamic_cast<TriggerEx<SMonsterMoveTrig>*>(pTrigger); pMonsterMoveTrig->OnTrigger(); return TRUE; } }; template<> class TriggerEx<SMonsterMoveTrig>: public Trigger { public: TriggerEx(); virtual ~TriggerEx(); // , LUA // : LUA ,LUA , virtual void OnTrigger(); private: // virtual void OnAction(IEvent *pEvent); // virtual void OnResponse(IEvent *pEvent); // void SubMsg(); // void UnSubMsg(); friend CreateTrig<SMonsterMoveTrig>; }; #endif //__MONSTER_MOVE_TRIGGER_H__

 
#include "MonsterMoveTrig.h"




TriggerEx<SMonsterMoveTrig>::TriggerEx()
{
}

TriggerEx<SMonsterMoveTrig>::~TriggerEx()
{

}

void TriggerEx<SMonsterMoveTrig>::OnTrigger()
{
	CLK::Trace::Print(TEXT("MonsterMoveTrig , Lua 
")); } void TriggerEx<SMonsterMoveTrig>::OnAction(IEvent *pEvent) { } void TriggerEx<SMonsterMoveTrig>::OnResponse(IEvent *pEvent) { }  

//--------------------------------------------------
#include <iostream>
#include "Trigger//Trigger.h"
#include "Trigger//TimerTrig//TimerTrig.h"
#include "Trigger//MonsterMoveTrig//MonsterMoveTrig.h"

using namespace std;

void main()
{
	CLK::BaseCLK::Init();

	typedef STimerTrig TestClass;
	TestClass data;
	Trigger* pTrigger = new TriggerEx<TestClass>();
	pTrigger->Create(&data);
	pTrigger->Release();
	pTrigger = NULL;

	CLK::BaseCLK::UnInit();
	system("pause");
}