提起模板,那我们有必要先了解一下泛型编程。
泛型编程:编写与类型无关的逻辑代码,是代码复用的一种手段。模板是泛型编程的基础。
模板又分为:类模板和函数模板。
首先看类模板的特化:
类模板的特化分为:全特化和部分特化。下面举例说明:
#include<iostream>
using namespace std;
template <typename T1,typename T2>
class Data
{
public:
Data()
{
cout << "Data(T1,T2)" << endl;
}
private:
T1 t1;
T2 t2;
};
template <>//全特化
class Data<int, double >
{
public:
Data()
{
cout<<" Data(int, double)" << endl;
}
private:
int d1;
double d2;
};
template <typename T>//部分特化
class Data<T, int >
{
public:
Data()
{
cout << "Data(T,int)" << endl;
}
private:
T t1;
int d1;
};
int main()
{
Data<int, double> d1;//全特化
Data<char, int> d2;//部分特化
Data<int, double> d3;//类模板
Data<int, char> d4;//类模板
return 0;
}
运行结果如下图:
接下来关于函数模板的特化:
对于函数模板,却只有全特化,不能偏特化
模板函数特化形式如下:
1、关键字template后面接一对空的尖括号<>
2、再接模板名和一对尖括号,尖括号中指定这个特化定义的模板形参
3、函数形参表
4、函数体
举例如下:
template <typename T>//模板函数
int Compare(T t1, T t2)
{
if (t1 < t2)
return 1;
if (t1 >t2)
return -1;
return 0;
}
template <>//全特化
int Compare<const char *>(const char * p1, const char * p2)
{
return strcmp(p1, p2);
}
int main()
{
const char *str1 = "1234";
const char *str2 = "abcd";
char *str3 = "1234";
char *str4 = "abcd";
cout << Compare(str1, str2) << endl;//全特化
cout << Compare(str3, str4) << endl;//模板函数
return 0;
}
注意:在模板特化版本的调用中,实参类型必须与特化版本函数的形参类型完全匹配,如果不匹配,编 译器将为实参模板定义中实例化一个实例。
转载于:https://blog.51cto.com/10922110/1765533