002 模板實參推斷 過載與模板

2022-03-12 03:09:28 字數 1281 閱讀 1714

一、模板函式顯示實參

情況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利用模板模板實現的,比如它的演算法都是...