模板类默认参数,模板类的特化,偏特化, 模板成员函数,模板的专用化例子

18 篇文章 0 订阅
#include "stdio.h"
#include "stdlib.h"
#include <typeinfo>
#include <iostream>
using namespace std;
class Sample2
{
public:
	template <class T>
	void print()
	{printf("\nSample2 print template , ");
	cout<<"print####:"<<typeid(T).name()<<endl;}
	template <class T>
	void print2();

};
//特化的时候template<class TypeA,class TypeB>  变为 template<>  
template <>
void Sample2::print<int>()
{printf("\nSample2 print int");}
template <class T>//<class T=int>error C4519: 仅允许在类模板上使用默认模板参数
void Sample2::print2( )
{cout<<"******print2:"<<typeid(T).name()<<endl;}

//模板类的参数默认
template<class TypeA = int, class TypeB = float>  
class MyClass  
{  
public:  
	TypeA value_A;  
	TypeB value_B;  
public:  
	explicit MyClass(TypeA valA,TypeB valB)  
	{  
		value_A = valA;  
		value_B = valB;  
	}  
	MyClass(){}  
	~MyClass(){}  
	TypeA GetValueA()  
	{  
		cout<<"无特化"<<endl;
		return value_A;  
	}  
	TypeB GetValueB();  

	//类成员函数模板类内实现 
	template<typename T>  
	void MemberFuntion(T Tval)  
	{  
		cout<<"成员函数模板的类型名: "<<typeid(T).name()<<endl;  
		cout<<"模板成员函数的值: "<<Tval<<endl;  
	}  
	template<typename T>  
	void MemberFuntion1(T Tval) ; 
	
};  
//模板类的偏特化
template<class TypeB>  
class MyClass  <int ,TypeB>
{  
public:  
	int value_A;  
	TypeB value_B;  
public:  
	explicit MyClass(int valA,TypeB valB)  
	{  
		value_A = valA;  
		value_B = valB;  
	}  
	MyClass(){}  
	~MyClass(){}  
	int GetValueA()  
	{  
		value_A=30;
		return value_A;  
	}  
	TypeB GetValueB()
	{
		return value_B;  
	}

	//类成员函数模板类内实现 
	template<typename T>  
	void MemberFuntion(T Tval)  
	{  
		cout<<"成员函数模板的类型名: "<<typeid(T).name()<<endl;  
		cout<<"模板成员函数的值: "<<Tval<<endl;  
	}  
	template<typename T>  
	void MemberFuntion1(T Tval) 
	{
		cout<<"成员函数模板的类型名: "<<typeid(T).name()<<endl;  
		cout<<"模板成员函数的值: "<<Tval<<endl;  
	}

}; 




//默认模板参数的类模板成员函数类外定义方式,在定义这里就不用再声明默认模板参数类型了  
template<class TypeA,class TypeB>  
TypeB MyClass<TypeA,TypeB>::GetValueB()  
{  
	return value_B;  
}  
  
//类成员函数模板类外实现 
//必须添加两个模板参数列表(template parameter list), 第一个为类的, 第二个为成员函数的;
template<class TypeA , class TypeB >  //类的参数列表
template<class T  >                   //类成员函数模板
void MyClass<TypeA , TypeB >:: MemberFuntion1(T  Tval)  
{  
	cout<<"成员函数模板的类型名: "<<typeid(T).name()<<endl;  
	cout<<"模板成员函数的值: "<<Tval<<endl;  
} 
//特化的时候template<class TypeA,class TypeB>  变为 template<>  
template<>  
int MyClass<int ,int >::GetValueB()  
{  
	value_B=50;
	return value_B;  
}
 
void main()
{
	Sample2 m_sample2;

	m_sample2.print<int>();
	m_sample2.print<double>();
	cout<<endl;

	MyClass<double,int >m_sample0(5.0,3);
	cout<<"a@@@@无特化@@@@@:"<<m_sample0.GetValueA()<<endl;

	MyClass<> m_sample1(3,5);
	cout<<"@@@@@@@@@a:"<<m_sample1.GetValueA()<<endl;
	m_sample1.MemberFuntion(3.5);
	m_sample1.MemberFuntion1(1);
	MyClass<int,int >m_sample3(5,3);
	cout<<"b全特化:"<<m_sample3.GetValueB()<<endl;

	

	MyClass<int ,double> m_sample4(3,5.67);
	cout<<"@@@@@@@@@偏特化222222a:"<<m_sample4.GetValueA()<<endl;
	cout<<"b222222@@@@@@@@@:"<<m_sample4.GetValueB()<<endl;
	system("pause");
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值