1.模板是生成類或函數的框架,模板使用形參,當實際數據類型賦值給形參的時候,才由編譯器生成類或函數
2.函數模板的聲明由關鍵字template和包含一個或多個數據類型形參的參數列表構成,形參數據類型(T)前面可以是class也可以是typename,類型形參T要用尖括號<>括起來:
Template <typename T>或Template<classT>
3.函數模板的調用
#include "stdafx.h"
#include<stdio.h>
template <class T>
T max(T a,T b)
{
returna>b?a:b;
}
int _tmain(int argc, _TCHAR* argv[])
{
printf("%d\n",max(3,10));//更ü完?善?寫′法ぁax<int>(3,10)
printf("%f\n",max<double>(21.3,20.1));
return 0;
}
4.用作模板的類型可以是基本類型,也可以是一個類,類似於函數模板的做法,類模板對成員數據和成員函數的參數類型進行泛化,下面是一個模板類A,構造函數和comp函數均在模板聲明中定義,成為內聯函數,print_Type函數在模板外定義,需要用關鍵字template說明T1和T2是模板類型,並以A<T1,T2>::做函數的前綴作用域
//templae2.cpp : 定¨義?控?制?台?應畖用?程ì序ò的?入?口ú點?。£
//
#include "stdafx.h"
#include <stdio.h>
#include <typeinfo.h>
template <class T1,class T2>
class A{
T1 i;
T2 j;//
public:
A(T1 t1,T2 t2){i=t1;j=t2;}//內聯函數
bool comp(){return i>j;}//內聯函數
voidprint_Type();//函數聲明
};
//成員函數printf_type定義
template <class T1,class T2>
voidA<T1,T2>::print_Type(){
printf("i的類型是%s\n",typeid(i).name());//打印i的類型名
printf("j的類型是?%s\n", typeid(j).name());
}
int _tmain(int argc, _TCHAR* argv[])
{ A<int,double> a(3,89.2);
if(a.comp())
{
printf("i>j\n");
}
else printf("i<=j\n");
a.print_Type();
return 0;
}
5.當模板的泛化處理不適合某個特定的數據類型時,可針對這個數據類型給出相應的模板,包括函數模板特化和類模板特化(叫完全特化技術也叫精確特化)