模板的全特化与偏特化

0人阅读 评论(0) 收藏 举报
分类:

特化得作用:

函数模板有时候不能适用于所有的数据类型(比如字符串的比较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;

}

 

查看评论

C++ 模板全特化和偏特化

1. 模板特化按对象类型(类和全局函数)分为两种: 类模板的特化和 全局模板函数的特化; 2. 按特化的类型分全特化和偏特化(也就是多个模板参数可以选定只 特化一个或者多个),全局模板函数的特化不支持...
  • hzhxxx
  • hzhxxx
  • 2015-12-03 09:30:12
  • 2481

函数模板全特化与偏特化

template class Test { public: Test(T1 i,T2 j):a(i),b(j){cout private: T1 a; T2 b; }; template clas...
  • s983134950
  • s983134950
  • 2015-04-21 11:00:35
  • 862

模板特化,全特化,偏特化,全部特化,部分特化的含义

这几个名词真是把人搞混了(是因为有的著作,甚至名著以讹传讹),我最近整理了以下,看看大家的意见如何。模板特化:任何针对模板参数进一步进行条件限制设计的特化版本。《泛型思维》全特化就是全部特化,即针对所...
  • zade
  • zade
  • 2005-12-06 11:50:00
  • 5487

c++学习(模板特化和偏特化)

模板特化和偏特化作者:谢宝陵  周 生(合肥市炮兵学院计算中心 230031)摘要:本文通过例子介绍了在 C++标准库中广泛使用的模板特化和偏特化,并指出了模板特化和偏特化的定义规则和应用规则。关键词...
  • zhang810413
  • zhang810413
  • 2007-12-18 22:26:00
  • 13147

类模板的全特化和偏特化

#include #include template class A { public: A(T1 self_str1,T2 self_str2) { printf("类模板:\n"); ...
  • crazyacm
  • crazyacm
  • 2016-09-21 16:29:29
  • 501

模版全特化与偏特化

/* 1、模版的特化 对于一个模版,对其中的所有模版参数指定确定的类型。 2、偏特化 对于一个模版,部分的模版参数指定确定的类型 3、在进行模版实例化的时候,编译器会对特定的类型找到最合适,最匹配的实...
  • charles1e
  • charles1e
  • 2016-07-27 09:25:20
  • 175

GP随笔: IF模板的一种非偏特化实现

IF模板一般设计如下:template struct IF {  typedef Then ret;};templatestruct IF {  typedef Else ret;};在不支持偏特化的...
  • SainTown
  • SainTown
  • 2006-02-17 12:04:00
  • 807

C++模板全特化、偏特化

1. C++模板 大家都对C++的模板编程应该都能很熟练使用了,下面就是一段很简单不过的例子了 //模板函数 template void func(T num1, N num2) { cout...
  • m_buddy
  • m_buddy
  • 2017-06-10 01:22:18
  • 158

为什么不要特化函数模版?

函数模版的全特化版本不参与函数重载解析,并且优先级低于函数基础模版参与匹配的原因是:C++标准委员会认为如果因为程序员随意写了一个函数模版的全特化版本,而使得原先的重载函数模板匹配结果发生改变(也就是...
  • magictong
  • magictong
  • 2015-09-19 11:30:13
  • 4531

C++ — 全特化和偏特化

全特化和偏特化
  • Dawn_sf
  • Dawn_sf
  • 2017-05-04 16:31:15
  • 1291
    个人资料
    持之以恒
    等级:
    访问量: 2711
    积分: 595
    排名: 8万+
    文章存档