一、模板函式顯示實參
情況1:
template t1 sum(t2 a, t3 b)
分析:呼叫的時候就需要指定t1的型別,如:sum(1, 2); 於是sum函式的返回型別為float。
情況2:
template //糟糕的設計,使用者必須指定所有的三個模板引數
t3 sum(t1 a, t2 b)
分析:對於sum(1, 2); 現在這個呼叫裡指定t1型別為float,但是實際傳進來的是1(int型別),會進行隱式型別轉換,將1轉換為float. t2的型別也可以根據sum(1,2)呼叫的第二個實參推斷出來,這裡是可能會是int. 那麼t3是什麼型別呢?顯然這裡編譯器無法推斷t3的型別,需要在呼叫時指定才能推斷:
1. sum(1, 2); 這樣t3就推斷出來是int。
2. 在指定顯示模板實參時指定的型別是和模板引數匹配的,順序是一一對應的,如:
• 使用sum(1, 2); 對上面的第乙個模板進行呼叫,那麼t1對應int,t2和t3則通過推斷得出。
• 使用 sum(1, 2); 對上面的第二個模板進行呼叫,那麼t1對應的型別是int,t2可以根據實際穿進去的引數進行推斷,這裡2為int,那麼t2型別就是int,那麼編譯器就無法知道t3的實際型別了。
二、完美**
template分析:string& ,且 std::forward 確保將 const
左值引用傳遞給 foo.
分析:舉例1 #include2 #include3
using
namespace
std;45
void g(int &&i, int &j)69
10void f(int v1, int &v2)
1114
15//
flip1實現不完整:頂層const和引用都丟掉了
16 template 17
void
flip1(f f, t1 t1, t2 t2)
1821
22 template 23
void flip2(f f, t1 &&t1, t2 &&t2)
2427
28 template 29
void flip(f f, t1 &&t1, t2 &&t2)
3033
34int
main()
35
模板實參推斷
定義 從函式實參確定模板實參的型別和值的過程叫做模板實參推斷 c primer 4th 舉例 template 模板型別形參 int compare const glorp v1,const glorp v2 函式形參 模板實參推斷的規則 1 如果某個函式的多個形參的型別是同乙個模板型別形參,推斷出...
STL運用的C 技術(3) 模板實參推斷
stl是c 標準庫的重要組成部分之一,它不僅是乙個可復用的元件庫,更是乙個包含演算法與資料結構的軟體框架,同時也是c 泛型程式設計的很好例子。stl中運用了許多c 的高階技術。本文介紹模板實參推斷的運用。主要參考了 c primer 和 stl原始碼剖析 stl利用模板模板實現的,比如它的演算法都是...
STL運用的C 技術(3) 模板實參推斷
stl是c 標準庫的重要組成部分之一,它不僅是乙個可復用的元件庫,更是乙個包含演算法與資料結構的軟體框架,同時也是c 泛型程式設計的很好例子。stl中運用了許多c 的高階技術。本文介紹模板實參推斷的運用。主要參考了 c primer 和 stl原始碼剖析 stl利用模板模板實現的,比如它的演算法都是...