模板類預設引數,模板類的特化,偏特化, 模板成員函式,模板的專用化例子
阿新 • • 發佈:2019-01-08
#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");
}