函式模版 特化 模版指標

2021-08-28 16:36:35 字數 4143 閱讀 5455

函式特化在下面做了大量的補充;

類模版

函式模版與類模版的乙個不同點是:

類模版如 :

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 使...