1. 程式人生 > >模板類預設引數,模板類的特化,偏特化, 模板成員函式,模板的專用化例子

模板類預設引數,模板類的特化,偏特化, 模板成員函式,模板的專用化例子

#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<<"
[email protected]
@@@無特化@@@@@:"<<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<<"
[email protected]
@@@@@@@@:"<<m_sample4.GetValueB()<<endl; system("pause"); }