模板的全特化与偏特化

特化得作用:

函数模板有时候不能适用于所有的数据类型(比如字符串的比较char *数据类型),由此需要进行特化处理,把不适用的部分单独拿出来携程一个函数。

 

什么是全特化?

全特化模板头是 template<>,模板形参没有任何参数,

编译器执行程序时,如果存在多个重载关系的模板。匹配的规则是先匹配特殊画的模板,如果没有匹配成功,在匹配通用的模板。 全特化的模板参数是空的,意味着全部模板形参类型在模板体中指定,了类似于普通的函数,但只有在程序中实例化后才能生成具体的代码。

 

什么是篇特化?

片特化的意思是模板的部分形式确定了下来 比如:

template<typenameT,unsigned int N>

 

 

例子:

#include<iostream>

 

using namespace std;

 

template <typenameT>

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;

}// 全特化, 实现对char *数组的处理

 

template < typenameT, 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))

{

Ttemp = 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()

{

inta[] = { 1, 2, 3, 4, 5, 8, 2, 4, 56, 8 };

charc[] = "hello world";

char*sp[] = { "hello", "thank you ", "i am ok","hehe" };

sort_data<int,sizeof(a)/sizeof(a[0])>(a);

sort_data<char,sizeof(c) / sizeof(c[0])-1>(c);

sort_data<char*, sizeof(sp) / sizeof(sp[0])>(sp);

system("pause");

return0;

}

 

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页