1.函數模板
我們經常用到Swap函數交換兩個值。由于需要交換的數據的類型不同,我們就需要寫不同參數類型的同名函數,也就是函數重載:
然而這三個函數的邏輯是一樣的,寫這么多有些多此一舉,通過函數模版可以寫一個通用的交換函數。
---------------------------------------------------------------------------------------------------------------------------------
1.格式:template<typename T1,typename T2,......typename Tn>
typename是關鍵字,也可以用class代替
T1-Tn是函數的參數類型名(T可以用別的名字代替,只是我們習慣用T)
---------------------------------------------------------------------------------------------------------------------------------
2.用法:
---------------------------------------------------------------------------------------------------------------------------------
3.原理:
檢測你傳入的參數類型,隱式的幫你生成這一類型的函數重載。實際上仍然生成了多個函數,調用的時候也不是調用同一個函數,而是調用對應的函數重載,只不過編譯器替你寫了這些函數。(實際上,由于交換函數使用頻繁,已經被納入庫中(swap),不需要我們去寫)
---------------------------------------------------------------------------------------------------------------------------------
4.函數模版的顯式實例化:
(1)有一種情況:
編譯器不確定T是int還是double類型。
為了解決這個問題你可以這樣:
但是你也可以這樣:
這樣直接指定了T類型而不用編譯器推演,叫做函數模板的顯式實例化(這種情況下,b會轉換為int類型)
(2)但是,如果同一個模板參數只做返回值的話:
編譯器不能根據推演返回值類型,所以必須模板實例化:
(3)如果有多個模板類型:
也可以同時指定T1,T2(返回值類型可以由T1決定(T1通過參數推演)。T1不是只做返回值,也就不是(3)的那種情況)
---------------------------------------------------------------------------------------------------------------------------------
2.類模板
類模板與函數模板不同的點在于,創建對象時一定要指定模板參數類型.
A<int>就相當于st1的類型
---------------------------------------------------------------------------------------------------------------------------------
