NO IMAGE

模板特化:
template<typename T>
int Compare(const T&v1,const T &v2)
{
 if( v1<v2 )
 {
  return -1;
 }
 if( v2<v1 )
 {
  return 1;
 }
 return 0;
}

如果用兩個const char *實參呼叫這個模板定義,函式將比較指標值,結果使指標在記憶體中的相對位置

template<>
int Compare<const char *>(const char * const &v1,const char *const &v2)
{
 return strcmp(v1,v2);
}
//形參為const char *的const 引用
模板特華可以宣告而無須定義,總是包含模板形參說明符,即template<>,還必須有函式形參表,如果可以從形參推斷模板實參,則不必需顯示指定模板實參

template<>
int Compare<const char *>//error. function parameter list missing

template<>
int Compare(const char *const &,const char *const &);   //ok
在類特化外部定義成員時,成員之前不能加template<>標記
如果不特化類,而只特化類中的特定成員,則需要加上template<> 標記

類别範本的部分特化:

如果類别範本有一個以上的模板形參,若只想特化某些模板形參而非全部,則可以:
template<typename T1,typename T2>
class Some_template
{
 //…
}; 
//partial specialization
template<class T1>
class Some_template<T1,int>
{
 //…
};

部分特化的模板形參是對應的模板定義形參標的子集

 

過載於函式模板:
函式模板可以過載
1、可以定義有相同名字組形引數目成型別不同的多個函式模板
2、可以定義與函式模板有相同名字的普通非模板函式

template<typename T>
int Compare(const T &,const T &);      (1)

template<class U,class V>
int Compare(U,U,V);                    (2)

int Compare(const char *,const char *);      (3)

Compare(1,0);    //calls (1)

vector<int> ivec1(10),ivec2(20);
Cpmpare(ivec1.begin(),ivec1.end(),ivec2.begin());   //calls (2)

int arr1[]={0,1,2,3,4};
Compare(arr1,arr1 10,ivec1.end());   //calls (2)

const char const arr1[]=”word”,const_arr2[]=”hi”;
Compare(const_arr1,const_arr2);       //calls (3)

普通函式和函式模板都完全匹配時,匹配同樣好,非模板版本優先