函式特化在下面做了大量的補充;
類模版
函式模版與類模版的乙個不同點是:
類模版如 :
template class a{};
那麼 a或 a是乙個類; 即a是模版,a後面帶著則是乙個類;
函式模版如:
template t compare(const t &a, const t& b)
;那麼compare生成compare(const int&,const int&);
compare-> compare(const double &, const double&);
compare後的<> 只決定了生成的函式版本;
這個區別在看類和函式2個模版的時候需要注意
/*
func.h
第乙個模版
模版只有當使用時,編譯器才會例項化,即生成**;
compare(1,0) 生成乙個函式 : compare(const int &a ,const int &b);
compare(1.0,2.0) 生成乙個過載: compare(const double &, const double&);
這種行為稱為例項化;
*/template //模版頭 . t是型別引數(int,double,short ... )
t compare(const t & a, const t & b)
//第一種方式: 隱式例項化,由編譯器通過形參來確定型別
compare(2,3) ; // 函式模版可以由編譯器通過引數型別推斷出 t 的型別, 也可以compare(2,3);
//第二種:
compare(1,1); //這稱為顯示例項化 ,生成的函式與上面一樣: int compare(const int &, const int&);
/* func.h
函式模版過載;
函式可以過載, 函式模版也可以過載;
乙個小例子, 不寫實現了;
與函式模版的過載一樣, 引數不一樣即可;
與上面的t compare(const t & a, const t & b) 過載
*/template t compare(t &a, t &b)
/* func.h
模版的非型別形參;
這個例子對引用陣列不熟悉的可以略過;
與上面不同的是 , template <> 內部並不是型別 .而是陣列長度
p1與p2 都是引用陣列;
對引用陣列額外介紹一些:如有char arr[3];
與指標指向整個陣列的形式相似 : const char (*p)[3] = arr ;
當然引用陣列還有另一種形式: const char *const &p = arr; 相當於引用arr 位址;
需要注意的是:
**如果形參是乙個引用, 實參是陣列,則形參指向的是陣列的型別,即帶長度的陣列;
** 例如, 上面的char arr[3]; 如果形參是引用,則其型別是: char [3] 或者 char (*)[3];
** 補充:
** template ** void func_ref(const t &t1, const t& t2);
** 在使用的時候 func_ref(arr,arr); 此時 t 的型別是const int [3]
** 生成的函式原型是: func_ref(const int (&t1)[3], const int(&t2)[3]);
*/#include template int compare(const char (&p1)[len1], const char(&p2)[len2])
//顯示例項化的例子如下:
/* 一般情況下直接呼叫:
compare(1,1); 即可 , 因為編譯器能自動推斷出來.
顯示例項化的意思是 也可以這麼用:
compare(1,1) ; 即生成了乙個long compare(const long&,const long&);
具體說明一下
下面的模版有3個引數;
*/template < typename returntype,typename t, typename u>
returntype compare(const t &a, const u &b)
template void swap(const char&,const char&);
函式指標指向函式模版:
/*
如有以下指標 p_func 指向乙個模版函式.
拿第乙個模版作為例子 :
template t compare(const t&,const t&);
指標函式引數 const int &, 確定了t的型別. 所以p_func 指向的是 compare;
compare==>
編譯器將生成 int compare(const int &, const int &);
*/int (*p_func)(const int &,const int&) = compare; // 或者compare
函式模版的具體化(特化):
/*
上面已經說過了函式模版過載,就像函式過載一樣;
現在說一下函式特化(具體化);
上面的所有模版例項都有編譯器替我們生成乙個個函式,
特化是由我們自己提供例項函式,讓編譯器別干涉生成了;
請注意特化只能對某個函式模版進行特化.
請下面的例子;
*//*
函式模版;
這個模版無法對const char*型別的字串進行比較, 裡面只用了 >= 進行比較;
所以必須進行修改,此時可以用到特化.即對這個模版進行特殊處理;
!!!!需要注意的是特化不是過載!!!!
***特化是對某個模版的所有模版引數提供實參
***換句話也可以這麼說, 特化是在本質上我們接管了編譯器的工作;
*** 即特化是這個模版的乙個例項,這個特化的例項函式由我們自己編寫
*/template int compare(const t& a, const t& b)
//第乙個例子:
template <> //摸板頭 , 對int 型別進行特化;
int compare(const int & a, const int & b)
//第二個例子: 對const char * 特化, 注意:所有引數由我們自己提供,函式模版沒有部分特化,類模版有
template <> // <>裡面為空,原模版的所有引數都由自己提供
int compare(const char * const & a, const char * const &b)
/*此時這個函式的例項化.由我們自己提供,編譯器將不生成**.
這2個呼叫將使用我們自己提供的特化版本;
當然如果你使用了compare(1.0,5.0); 由於並沒有特化版本,
此時編譯器將生成乙個;
*/compare(1,2); //也可以呼叫 compare(1,2);
const char * p1 = "123";
const char * p2 = "456";
compare(p1,p2); // 呼叫 compare(const char* const &,const char* const &);
/*
這個是函式模版過載;
請注意過載是過載,特化是特化.
特化是對某1個函式模版進行的例項化
*/template int compare(const t & a, const u & b)
/* 這個特化是對上面的過載模版進行特化
一定要分清特化與過載的區別;
*/template <>
int compare(const int & a, const double & b)
int main()
最後總結一下特化(具體化):
1.特化就是我們自己提供的乙個例項化;意思是編譯器你別生成了,直接用我們提供的即可;
2.特化是對某1個函式模版進行特化.
3.特化並不是過載,
函式模版和模版函式,類模版和模版類的區別
什麼是函式模板和類模板 函式模板是一種抽象函式定義,它代表一類同構函式。通過使用者提供的具體引數,c 編譯器在編譯時刻能夠將函式模板例項化,根據同乙個模板建立出不同的具體函式,這些函式之間的不同之處主要在於函式內部一些資料型別的不同,而由模板建立的函式的使用方法與一般函式的使用方法相同。函式模板的定...
c 函式模版
如果需要多個將同乙個演算法用於不同型別的函式,請使用模版 函式模版 要讓編譯器知道程式需要乙個特定形式的交換函式,只需在程式中使用swap 函式即可,編譯器將檢查所使用的引數型別,並生成相應的函式,1.template void swap anytype a,anytype b anytype te...
C 模版特化
問題 對於compare 函式模板,與 c 風格字串一起使用,它們都不能正確工作 函式模版定義 template int compare const t v1,const t v2 如果用兩個 const char 實參呼叫這個模板定義,函式將比較指標值 cout compare abc 123 使...