1.类模板及其(全)特化和偏特化
模板特化是通过"给模板中的所有模板参数一个具体的类"的方式来实现的.而模板偏特化则是通过"给模板中的部分模板参数以具体的类,而留下剩余的模板参数仍然使用原来的泛化定义"的方式来实现。
/*类模板的特化*/
template<> class compare<char*,char>{
public:
void printType(char* t1,char t2){
cout << "all specialization" << endl;
cout << typeid(t1).name() << endl;
cout << typeid(t2).name() << endl;
cout << "-----------------------" << endl;
}
};
/*类模板的偏特化*/
template<typename T2> class compare<char*,T2>{
public:
void printType(char* t1,T2 t2){
cout << "1st partial specialization" << endl;
cout << typeid(t1).name() << endl;
cout << typeid(t2).name() << endl;
cout << "-----------------------" << endl;
}
};
template<typename T1> class compare<T1,char*>{
public:
void printType(char* t2,T1 t1){
cout << "2nd partial specialization" << endl;
cout << typeid(t2).name() << endl;
cout << typeid(t1).name() << endl;
cout << "-----------------------" << endl;
}
};
/*类模板及特化测试代码*/
compare<int,double> c1;
compare<char*,char> c2;
compare<char*,long> c3;
compare<double,char*> c4;
c1.printType(5,2.3);
c2.printType("ab",'a');
c3.printType("ab",12343);
c4.printType("ab",238.212);
2.函数模板及特化
/*函数模板*/
template <typename T> T mymax(const T t1, const T t2)
{
return t1 < t2 ? t2 : t1;
}
/*函数模板特化*/
template <> const char* mymax(const char* t1,const char* t2)
{
return (strcmp(t1,t2) < 0) ? t2 : t1;
}
/**函数模板及特化测试代码*/
int highest = mymax(5,10);
char c = mymax('a', 'z');
const char* p1 = "hello";
const char* p2 = "world";
const char* p = mymax(p1,p2);
严格的来说,函数模板并不支持偏特化,但由于可以对函数进行重载,所以可以达到类似于类模板偏特化的效果。
template <class T> void f(T); (a)
根据重载规则,对(a)进行重载
template < class T> void f(T*); (b)
如果将(a)称为基模板,那么(b)称为对基模板(a)的重载,而非对(a)的偏特化。C++的标准委员会仍在对下一个版本中是否允许函数模板的偏特化进行讨论。
3.成员模板函数及特化
class A
{
private:
int a;
public:
template<typename T> void show(T t1); //成员模板函数声明
template<> void show<int>(int t1); //成员模板函数特化声明
};
/*成员模板函数定义*/
template<typename T> void A::show(T t1)
{
cout << "normal member template function" << endl;
cout << t1 << endl;
}
/*成员模板函数特化定义*/
template<> void A::show<int>(int t1)
{
cout << "member template function specialization" << endl;
cout << t1 << endl;
}
/*成员模板函数及特化测试代码*/
A a;
a.show("abd");
a.show(5);
成员模板函数的声明和定义最好都写在头文件中,否则有些编译器可能会报错。