模板分为函数模板和类模板
函数模板:是一种抽象函数定义,它代表一类同构函数。
类模板:是一种更高层次的抽象的类定义。
我们很难写出所有可能被实例化的类型都合适的模板。在有些时候,一般性的模板定义对于某种类型来说并不适用。某些情况下,通用模板定义对于某个类型可能是完全错误的,所以我们需要能够实现处理某些特殊情况。
为了解决这个问题,模板的特化应运而生。
模板的特化(template specialization)分为两类:函数模板的特化和类模板的特化。
函数模板的特化:当函数模板需要对某些类型进行特化处理,称为函数模板的特化。为了获得正确的语义,我们必须为函数模板实例化提供特化的定义。
在模板显式特化定义(explicit specialization definition) 中,先是关键字template 和一对尖括号(<>, 一个小于号和一个大于号),然后是函数模板特化的定义。
类模板的特化:当类模板内需要对某些类型进行特别处理时,使用类模板的特化。
下面的代码中,如果用两个char* 实参调用模板定义,函数将比较指针的值。也就是比较两个指针在内存中的相对位置,却并没有说明与指针所指数组的内容有关的任何事情。
为了能够将IsEuqal函数用于字符串,必须提供一个知道怎样比较C风格字符串的特殊定义。这个定义就被称作是特化,它对模板的用户而言是透明的。
- // 泛型编程.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include <iostream>
- using namespace std;
- //函数模板
- template<class T>
- bool IsEqual(T t1,T t2){
- return t1==t2;
- }
- template<> //函数模板特化
- bool IsEqual(char *t1,char *t2){
- return strcmp(t1,t2)==0;
- }
- //类模板
- template<class T>
- class compare{
- public:
- bool IsEqual(T t1,T t2){
- return t1==t2;
- }
- };
- //类模板的特化
- template<>
- class compare<char*>{
- public:
- bool IsEqual(char *t1,char *t2){
- return strcmp(t1,t2)==0;
- }
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- char str1[]="abc";
- char str2[]="abc";
- cout<<"函数模板和函数模板特化"<<endl;
- cout<<IsEqual(1,1)<<endl;
- cout<<IsEqual(str1,str2)<<endl;
- compare<int> c1;
- compare<char*> c2;
- cout<<"类模板和类模板特化"<<endl;
- cout<<c1.IsEqual(1,1)<<endl;
- cout<<c2.IsEqual(str1,str2)<<endl;
- getchar();
- return 0;
- }