模版默认参数自动填充的方法

 
//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()
}




 









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值