/********************************************************************
* 文件名: Bind_Par.h
* 文件描述: 参数绑定器
* 创建人: 陈泽丹 ,2012年10月25日
* 版本号: 1.0
* 备注:
每次打包参数以做网络通讯的传递太麻烦了, 所以封装绑定参数的操作。
其中利用模板参和偏特化无关联的特性,让使用者可采用参数来区分,而不是采用模板名不同来区分
********************************************************************/
#define TYPELIST_1(T1) \
Typelist<T1, NullType>
#define TYPELIST_2(T1, T2) \
Typelist<T1, TYPELIST_1(T2) >
#define TYPELIST_3(T1, T2, T3) \
Typelist<T1, TYPELIST_2(T2, T3) >
#define TYPELIST_4(T1, T2, T3, T4) \
Typelist<T1, TYPELIST_3(T2, T3, T4) >
#define TYPELIST_5(T1, T2, T3, T4, T5) \
Typelist<T1, TYPELIST_4(T2, T3, T4, T5) >
class NullType {};
template <class T, class U>
struct Typelist
{
typedef T Head;
typedef U Tail;
};
template <class TList>
struct Bind_Par;
template <class _P1>
struct Bind_Par< TYPELIST_1(_P1) >
{
public:
typedef _P1 Parm1;
Parm1 par1;
Bind_Par< TYPELIST_1(Parm1) >( Parm1 _par1): par1(_par1){}
};
template <class _P1, class _P2>
struct Bind_Par< TYPELIST_2(_P1, _P2) >
{
public:
typedef _P1 Parm1;
typedef _P2 Parm2;
Parm1 par1;
Parm2 par2;
Bind_Par< TYPELIST_2(Parm1, Parm2) >( Parm1 _par1, Parm2 _par2): par1(_par1), par2(_par2){}
};
template <class _P1, class _P2, class _P3>
struct Bind_Par< TYPELIST_3(_P1, _P2, _P3) >
{
public:
typedef _P1 Parm1;
typedef _P2 Parm2;
typedef _P3 Parm3;
Parm1 par1;
Parm2 par2;
Parm3 par3;
Bind_Par< TYPELIST_3(Parm1, Parm2, Parm3) >( Parm1 _par1, Parm2 _par2, Parm3 _par3): par1(_par1), par2(_par2), par3(_par3){}
};
template <class _P1, class _P2, class _P3, class _P4>
struct Bind_Par< TYPELIST_4(_P1, _P2, _P3, _P4) >
{
public:
typedef _P1 Parm1;
typedef _P2 Parm2;
typedef _P3 Parm3;
typedef _P4 Parm4;
Parm1 par1;
Parm2 par2;
Parm3 par3;
Parm4 par4;
Bind_Par< TYPELIST_4(Parm1, Parm2, Parm3, Parm4) >( Parm1 _par1, Parm2 _par2, Parm3 _par3, Parm4 _par4): par1(_par1), par2(_par2), par3(_par3), par4(_par4){}
};
template <class _P1, class _P2, class _P3, class _P4, class _P5>
struct Bind_Par< TYPELIST_5(_P1, _P2, _P3, _P4, _P5) >
{
public:
typedef _P1 Parm1;
typedef _P2 Parm2;
typedef _P3 Parm3;
typedef _P4 Parm4;
typedef _P5 Parm5;
Parm1 par1;
Parm2 par2;
Parm3 par3;
Parm4 par4;
Parm5 par5;
Bind_Par< TYPELIST_5(Parm1, Parm2, Parm3, Parm4, Parm5) >( Parm1 _par1, Parm2 _par2, Parm3 _par3, Parm4 _par4, Parm5 _par5): par1(_par1), par2(_par2), par3(_par3), par4(_par4), par5(_par5){}
};
struct GameMsg
{
GameMsg(long _role_uid, long _world_uid, long _world_x, long _world_y):data(_role_uid, _world_uid, _world_x, _world_y){}
Bind_Par< TYPELIST_4(long, long, long, long) > data;
};
#include <iostream>
using namespace std;
#include "Bind_Par.h"
void main()
{
GameMsg move(101, 1, 50, 40);
cout<<move.data.par1<<endl;
cout<<move.data.par2<<endl;
cout<<move.data.par3<<endl;
cout<<move.data.par4<<endl;
system("pause");
}