自定义模板

一、几个概念

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;
}

猜你喜欢

转载自blog.csdn.net/hahaandhehe/article/details/80009815