一、几个概念
1.模板的实例化:
模板是程序的样板,也就是将具备相同规律(算法)的功能,忽略操作数类型的不同定义程一个模板。在真正使用时,使用明确的数据类型替换待定类型,使通用程序具体化,这个过程称为模板的实例化。
2.全特化:
特殊化模板头形式是template<>,模板形参中没有任何参数,这样的模板特殊化称为全特化。
编译器执行程序时,如果存在多个重载关系的模板,匹配规则是:先匹配特殊化的模板,如果没有匹配成功,再匹配通用的模板。
3.偏特化:
模板的形式部分确定下来,该形式前面已经用过。
例子:使用偏特化来实现排序:
具体要求:
(1)实现支持多种类型的数据排序的函数模板
a.函数模板sort,参考定义形式:template<typename> void sort(T a[], int n, bool type){//……}
其中参数n表示数组a中参数排序的个数,type表示排序的类型,0(false)升序,1(true)表示降序。
b.函数模板show,用于显示指定个数的数组元素,参考定义形式:template<typename T> void show(T a[], int n){//……}
c.函数模板sort_data,用于实现分别显示一组数组的原始数据,升序数据,降序数据,在实现的过程中可以调用函数模板sort,show。sort_data函数模板的参考定义形式:template<typename T> void sort_data(T a[], int n){//……}
(2)compare函数模板首先实现一个通用模式。
(3)再重载compare函数模板,使用全特化形式处理C风格字符串。
(4)sort、sort_data、show三种函数模块使用偏特化。
(5)支持char、int、float、char*、string等类型数据的升降排序。
#include<iostream>
#include<cstring>
using namespace std;
template<typename T>
bool compare(T &v1, T &v2, bool flag)
{
return ((v1 < v2) ^ flag);
}
template<>
bool compare(char* &p1, char* &p2, bool flag)
{
return (strcmp(p1, p2) < 0) ^ flag;
}
template<typename T, int N, bool flag>
void sort(T a[])
{
for(int i = 0; i < N - 1; i++)
for(int j = N - 1; j > i; j--)
{
if(compare<T>(a[j], a[j - 1], flag))
{
T temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
}
template<typename T, int N>
void show(T a[])
{
for(int i = 0; i < N; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
template<typename T, int N>
void sort_data(T a[])
{
cout << "*************************************" << endl;
cout << "old data:";
show<T, N>(a);
cout << "Asc data:";
sort<T, N, false>(a);
show<T, N>(a);
cout << "Desc data:";
sort<T, N, true>(a);
show<T, N>(a);
cout << "*************************************" << endl;
}
int main()
{
int a[] = {100, 2, 76, 98, 33, 77, 55, 22, 88, 99};
char c[] = "comeonbaby";
float f[] = {11.11, 2.2, 777.7, 8888.88, 555.55};
string s[] = {"There", "is", "an", "apple!"};
char *sp[] = {"Do", "you", "keep", "your", "eyes", "upon", "the", "doughnut"};
sort_data<int, sizeof(a) / sizeof(a[0])>(a);
sort_data<char, sizeof(c) / sizeof(c[0]) - 1>(c);
sort_data<float, sizeof(f) / sizeof(f[0])>(f);
sort_data<string, sizeof(s) / sizeof(s[0])>(s);
sort_data<char*, sizeof(sp) / sizeof(sp[0])>(sp);
return 0;
}