模板和模板特化

模板分为函数模板和类模板

函数模板:是一种抽象函数定义,它代表一类同构函数。

类模板:是一种更高层次的抽象的类定义。

 

我们很难写出所有可能被实例化的类型都合适的模板。在有些时候,一般性的模板定义对于某种类型来说并不适用。某些情况下,通用模板定义对于某个类型可能是完全错误的,所以我们需要能够实现处理某些特殊情况。

为了解决这个问题,模板的特化应运而生。

模板的特化(template specialization)分为两类:函数模板的特化和类模板的特化。

函数模板的特化:当函数模板需要对某些类型进行特化处理,称为函数模板的特化。为了获得正确的语义,我们必须为函数模板实例化提供特化的定义。

在模板显式特化定义(explicit specialization definition) 中,先是关键字template 和一对尖括号(<>, 一个小于号和一个大于号),然后是函数模板特化的定义。

类模板的特化:当类模板内需要对某些类型进行特别处理时,使用类模板的特化。

 

下面的代码中,如果用两个char* 实参调用模板定义,函数将比较指针的值。也就是比较两个指针在内存中的相对位置,却并没有说明与指针所指数组的内容有关的任何事情。

为了能够将IsEuqal函数用于字符串,必须提供一个知道怎样比较C风格字符串的特殊定义。这个定义就被称作是特化,它对模板的用户而言是透明的。

 

  1. // 泛型编程.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include <iostream>  
  6. using namespace std;  
  7. //函数模板  
  8. template<class T>  
  9. bool IsEqual(T t1,T t2){  
  10.     return t1==t2;  
  11. }  
  12.   
  13. template<> //函数模板特化  
  14. bool IsEqual(char *t1,char *t2){  
  15.     return strcmp(t1,t2)==0;  
  16. }  
  17.   
  18. //类模板  
  19. template<class T>  
  20. class compare{  
  21. public:  
  22.     bool IsEqual(T t1,T t2){  
  23.         return t1==t2;  
  24.     }  
  25. };  
  26.   
  27. //类模板的特化  
  28. template<>  
  29. class compare<char*>{  
  30. public:  
  31.     bool IsEqual(char *t1,char *t2){  
  32.         return strcmp(t1,t2)==0;  
  33.     }  
  34. };  
  35. int _tmain(int argc, _TCHAR* argv[])  
  36. {  
  37.     char str1[]="abc";  
  38.     char str2[]="abc";  
  39.     cout<<"函数模板和函数模板特化"<<endl;  
  40.     cout<<IsEqual(1,1)<<endl;  
  41.     cout<<IsEqual(str1,str2)<<endl;  
  42.     compare<int> c1;  
  43.     compare<char*> c2;  
  44.     cout<<"类模板和类模板特化"<<endl;  
  45.     cout<<c1.IsEqual(1,1)<<endl;  
  46.     cout<<c2.IsEqual(str1,str2)<<endl;  
  47.     getchar();  
  48.     return 0;  
  49. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值