//ParamDefine.h
//
//由于模板默认参数过多,导致要给后面的参数赋值时,前面的默认参数都要手动填写
//
//为了避免此种情况出现
//使用下面的方式,可以直接实现填写相应的参数就可以了
//
//
#pragma once
#include <iostream>
//默认参数1
class _CParam1
{
public:
static void f(){}
};
//默认参数2
class _CParam2
{
public:
static void f(){}
};
//包含两个参数的封装参数
class CParam
{
public:
typedef _CParam1 P1;
typedef _CParam2 P2;
protected:
private:
};
class CDefaultParam : virtual public CParam
{
};
//模版指定参数1
template<typename Param1>
class CParam1 : virtual public CParam
{
public:
typedef Param1 P1;
};
//模版指定参数2
template<typename Param2>
class CParam2 : virtual public CParam
{
public:
typedef Param2 P2;
};
//参数分类器
template<typename _Param, int n>
class CDiscriminator : public _Param
{
};
//参数选择器
template<typename _Param1, typename _Param2>
class CSelector : public CDiscriminator<_Param1,1>, public CDiscriminator<_Param2,2>
{
};
//外部调用模版,入口
template<typename _Param1=CDefaultParam, typename _Param2=CDefaultParam>
class CUser
{
public:
typedef CSelector<_Param1,_Param2> selector;
void f()
{
selector::P1::f();
selector::P2::f();
}
};
//实参1
class CParameter1
{
public:
static void f()
{
std::cout<<"P1::f()"<<std::endl;
}
};
//实参2
class CParameter2
{
public:
static void f()
{
std::cout<<"P2::f()"<<std::endl;
}
};
//ParamDefine.h end
使用方法:
int _tmain(int argc, _TCHAR* argv[])
{
CUser<> U1;
U1.f();//_CParam1::f() _CParam2::f()
CUser<CParam2<CParameter2>> U2;
U2.f();//_CParam1::f() CParameter2::f()
CUser<CParam1<CParameter1>> U3;
U3.f();//CParameter1::f() _CParam2::f()
CUser<CParam1<CParameter1>,CParam2<CParameter2>> U4;
U4.f();//CParameter1::f() CParameter2::f()
CUser<CParam2<CParameter2>,CParam1<CParameter1>> U5;
U5.f();//CParameter1::f() CParameter2::f()
}