模板特化可以分为全特化和偏特化
特化可以为类增加成员函数或成员变量
模板特化有三种类型,一是特化为绝对类型,二是特化为引用、指针类型,三是特化为另外一个模板类
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
template <class T>
T maxR(T t1,T t2)
{
return t1;
}
template<>
const char* maxR<const char*> (const char* t1,const char* t2)
{
return (strcmp(t1,t2)<0) ?t2: t1;
}
template<class CT>
class MyClass
{
public:
MyClass()
{
}
CT show(CT val)
{
cout<<"Class did a good job!"<<val<<endl;
return val;
}
};
template<>
class MyClass<int>
{
public:
MyClass()
{
}
int show(int val)
{
cout<<"Special Class did a good job!"<<val<<endl;
return val;
}
};
template <typename T1,class T2>
class MyPTClass
{
public:
T1 show(T2 val)
{
T1 hi;
return hi;
}
T1 T1Show(T1 t1)
{
cout<<""this is from t1<<t1<<endl;
return t1;
}
T2 T2Show(T2 t2)
{
cout<<"This is from t2"<<t2<<endl;
return t2;
}
};
template<class T2>
class MyPTClass<string,T2>
{
public:
string show(T2 val)
{
string hi="This is from PTclass";
cout<<hi<<val<<endl;
return hi;
}
T2 T2Show(T2 t2)
{
cout<<"This is from t2"<<t2<<endl;
return t2;
}
};
int main()
{
const char * str1="Good";
const char * str2="bad";
int a=5,b=12;
cout<<maxR(a,b)<<endl;
cout<<maxR(str1,str2)<<endl;
MyClass<int> obj;
obj.show(59);
MyClass<string> obj2;
obj2.show("what the fuck?");
MyPTClass<string,float> PTobj;
PTobj.show(1230);
PTobj.T2Show(3.1415f);
return 0;
}