C 知識點55 函式模板

2021-10-11 11:41:14 字數 2053 閱讀 4763

一、為啥需要模板

防止相同功能的重複實現

二、函式模板

1、模板函式的定義

template const t& max(const t &a, const t &b)

上述**就是個最簡單的函式模板

template關鍵字表示模板,<>中的typename用來表示模板引數,模板引數名字是t。函式體中指向operator>,所以t必須支援operator>

在這裡typename可以用class來替換,但是不能用struct來替換

2、模板函式的使用

int main(int argc, char const *ar**)

max(10.2, 20);

在編譯tip3中的**時,會出現警告

之所以出現問題是因為:例項化max時,函式的返回值型別有可能和t2不同,上述**中,返回值型別是const int&,但是返回的有可能是a,也有可能是b,如果返回的是a且a的繫結變數的型別是double,那麼當函式返回時,就會出現如下型別轉換

const t1 tmp=t2; 

const t2 &res=tmp;

上述轉換在一般情況下沒問題,但是因為tmp在函式內部,是個區域性臨時變數,函式作用域結束後就無效了,所以不能當做返回值讓const t2的引用繫結,所以就會出現上面的警告,關於const與引用見部落格

解決辦法就是將返回值的型別變成const t1或者const t2

template const t2 max(const t1 &a, const t2 &b)

上述**的問題就在於當例項化乙個max函式時,返回值有可能被隱式轉化

或者直接加個返回值模板引數用來指定返回值

template const rt max(const t1 &a, const t2 &b)

這種辦法帶來的問題就是需要顯示指定模板引數rt,因為不能對函式模板的返回值進行模板實參推斷,所以呼叫max時很麻煩

max(10, 20.2);
必須得按順序顯示指定模板引數的型別此時如果還呼叫max(10, 20.2);編譯就無法通過,因為rt的型別沒有指定

為了簡單一些,可以將rt放在最前面

template < typename rt,typename t1, typename t2>

const rt max(const t1 &a, const t2 &b)

max(10, 20.2);

這樣在例項化函式時,只需要指定返回值rt的型別即可,而不需要指定所有的模板引數

4、函式模板的過載

函式模板也可以過載。當出現過載時,呼叫原則如下:當乙個非模板函式和乙個模板函式重名且該模板函式可以例項化為該非模板函式,那麼在呼叫時,會呼叫非模板函式,而不會從模板函式中產生乙個例項

第17行中,尖括號中沒有指定任何型別,意味著編譯器需要呼叫模板版本的mymax並進行實參推斷參考

《c++ template》

《c++ primer》

c 知識點總結 函式模板

通用函式可變參模板 用於處理不限定引數的函式 showall template void showall t value,args args template void showall const t value,const args args 設計可以修改原來的資料 t value,args ar...

C 函式模板基礎知識

為什麼要引入模板 為了避免 重複,程式設計師可以編寫脫離資料型別通用模板。模板的分類 函式模板 類模板 注意 模板的宣告或定義只能在全域性,命名空間或類範圍內進行。不能在函式內進行,比如不能在main函式中宣告或定義乙個模板。函式模板 定義 模板函式 重點在函式,是對函式模板進行引數例項化後的結果,...

c 函式模板

include using namespace std template t max t a,t b,t c int main int main int i1 185,i2 76,i3 567,i double d1 56.63,d2 90.23,d3 3214.78,d long g1 67854...