002 模板實參推斷、重載與模板

模板實參推斷

一、模板函數顯示實參

情況1:

template <typename T1, typename T2, typename T3>
T1 sum(T2 a, T3 b)
{return a + b;
}

分析:調用的時候就需要指定T1的類型,如:sum<float>(1, 2); 于是sum函數的返回類型為float。

?

?情況2:

template <typename T1, typename T2, typename T3> //糟糕的設計,用戶必須指定所有的三個模板參數
T3 sum(T1 a, T2 b) 
{return a + b;
}

分析:對于sum<float>(1, 2); 現在這個調用里指定T1類型為float,但是實際傳進來的是1(int類型),會進行隱式類型轉換,將1轉換為float.?T2的類型也可以根據sum(1,2)調用的第二個實參推斷出來,這里是可能會是int. 那么T3是什么類型呢?顯然這里編譯器無法推斷T3的類型,需要在調用時指定才能推斷:

1. ??sum<int,?int,?int>(1,?2);?這樣T3就推斷出來是int。?

2. 在指定顯示模板實參時指定的類型是和模板參數匹配的,順序是一一對應的,如:

? ? ???使用 sum<int>(1, 2); 對上面的第一個模板進行調用,那么T1對應int,T2T3則通過推斷得出。

? ? ???使用 sum<int>(1, 2); 對上面的第二個模板進行調用,那么T1對應的類型是int,T2可以根據實際穿進去的參數進行推斷,這里2為int,那么T2類型就是int,那么編譯器就無法知道T3的實際類型了。

?

?二、完美轉發

template<class T>
void wrapper(T&& arg) 
{// arg 始終是左值foo(std::forward<T>(arg)); // 轉發為左值或右值,依賴于 T
}  分析:1. 若對 wrapper() 的調用傳遞右值string ,則推導 T 為 std::string(非string& 或string&& ,且 std::forward 確保將右值引用傳遞給 foo.2. 若對 wrapper() 的調用傳遞 const 左值string ,則推導 T 為 const string& ,且 std::forward 確保將 const 左值引用傳遞給 foo.3. 若對 wrapper() 的調用傳遞非 const 左值string ,則推導 T 為string& ,且 std::forward 確保將非 const 左值引用傳遞給 foo.?

分析:

1. 若對 wrapper() 的調用傳遞右值string ,則推導 T 為 std::string(非string& 或string&& ,且 std::forward 確保將右值引用傳遞給 foo.

2. 若對 wrapper() 的調用傳遞 const 左值string ,則推導 T 為 const string& ,且 std::forward 確保將 const 左值引用傳遞給 foo.

3. 若對 wrapper() 的調用傳遞非 const 左值string ,則推導 T 為string& ,且 std::forward 確保將非 const 左值引用傳遞給 foo.

?舉例

 1 #include<iostream>
 2 #include<utility>
 3 using namespace std;
 4 
 5 void g(int &&i, int &j)
 6 {
 7     cout << i << " " << j << endl;
 8 }
 9 
10 void f(int v1, int &v2)
11 {
12     cout << v1 << " " << ++v2 << endl;
13 }
14 
15 //flip1實現不完整:頂層const和引用都丟掉了
16 template <typename F, typename T1, typename T2>
17 void flip1(F f, T1 t1, T2 t2)   
18 {
19     f(t2, t1);
20 }
21 
22 template <typename F, typename T1, typename T2>
23 void flip2(F f, T1 &&t1, T2 &&t2)
24 {
25     f(t2, t1);
26 }
27 
28 template <typename F, typename T1, typename T2>
29 void flip(F f, T1 &&t1, T2 &&t2)
30 {
31     f(std::forward<T2>(t2), std::forward<T1>(t1));
32 }
33 
34 int main()
35 {
36     int i = 0, j = 0, k = 0, l = 0;
37     cout << i << " " << j << " " << k << " " << l << endl;
38     f(42, i);         //f改變其實參i
39     flip1(f, j, 42);  //通過flip1調用f不會改變j
40     flip2(f, k, 42);  //正確:k被改變了
41     g(42, i);
42     flip(g, i, 42);   //正確:第三個參數的右值屬性被保留了
43     cout << i << j << " " << k << " " << l << endl;
44     return 0;
45 }

?

重載與模板

轉載于:https://www.cnblogs.com/sunbines/p/9375847.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251112.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251112.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251112.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DOM-4 【utils/待講評】節點創建刪除、元素屬性設置獲取、節點屬性

講評 節點創建 Document.prototype ← document.createElement(div)document.createTextNode(xxx) // 創建文本節點document.createComment(xxx) // 創建注釋節點 增加/剪切子節點 Node.prototype ← node.appendChild(node)總是在父元素的最后增加&#xff08;類似push&am…

javascript --- 事件對象和事件類型

// 無論程序使用"DOM0級"規范還是"DOM2級"規范,都會在局部產生一個event對象, // 將其打印出來研究: <div id"divBtn"><button id"rawBtn" >Click Me!</button></div> <script>const divBtn document…

關于APP更新,兩包共存的解決方案

大多數是由于包名不一致導致的&#xff0c;一定要注意包名一致、不然手機會認為是兩個app&#xff0c;導致兩個包共存 查看包名的方法 1、hbuilder打包時會有提示 2、手機打開設置->應用->正在運行->對應app即可查看 轉載于:https://www.cnblogs.com/zz-0128/p/827969…

DOM-5【兼容】滾動距離與高度、兼容模式、可視尺寸

查看滾動條的距離 方法版本window.pageXOffset / pageYOffsetIE9/IE8及以下不支持(常規)document.body.scrollLeft/scrollTopIE9/IE8及以下(部分支持&#xff0c;具體看模式)document.documentElement.scrollLeft/scrollTopIE9/IE8及以下(部分支持&#xff0c;具體看模式)wind…

python中with及closing

推薦使用 "with"語句 以管理文件:with open("hello.txt") as hello_file: for line in hello_file: print line對于不支持使用"with"語句的類似文件的對象,使用 contextlib.closing():import contextlibwith contextlib.closing(urlli…

http --- Web頁面請求的歷程(如何根據URL尋找到需要的資源)

HTTP概況: // 超文本傳輸協議(HyperText Transfer Protocol,HTTP):是Web的應用層協議,它是Web的核心. // 客戶端和服務器運行在不同的端系統中,通過交換HTTP報文進行會話 // HTTP定義了這些報文的結構以及客戶和服務器進行報文交換的方式 // HTTP定義了Web客戶向Web服務器請求…

DOM-6 【兼容】讀寫樣式屬性、操作偽元素、運動元素初探

規范 <style type"text/css"></style><script type"text/javascript"></script>讀寫樣式屬性 .style是訪問不到css樣式表的&#xff0c;只能訪問到行內/內聯的屬性&#xff0c;當未設置行內屬性時&#xff0c;結果為空字符串 設…

RGBD論文閱讀筆記

Single-Image Depth Perception in the Wild 簡要記載一下對于利用RGB圖像depth圖像得到segmentation的論文。 論文名稱&#xff1a;Cascaded Feature Network for Semantic Segmentation of RGB-D Images 論文出處 ICCV 2017 Lin 模型結構 數據集 NYUDv2 SUN-RGBD 性能分析 總…

vue組件調用(全局調用和局部調用)

當用vue-cli創建一個項目后, 創建項目的方法: https://www.cnblogs.com/fps2tao/p/9376847.html 編寫了組件怎么,在其他組件中調用了? 組件listBox: 路徑 src/components/listBox.vue <template><div class"listBox">listBox222</div> </templ…

http --- 路由器緩存與常見的狀態碼

路由器的緩存: // 當下路由器其主要系統性能指吞吐率、利用率、丟包率、延遲、緩存大小和實現復雜性等. // 當鏈路上發生擁塞時能夠對新進入的數據包進行緩存 // 從而降低丟包率、維持高的鏈路利用率 // 用于存放路由表的內存,速度快,價格也高狀態碼: // 為客戶端提供了一種理…

DOM-7 【兼容】事件處理函數、冒泡捕獲、阻止冒泡默認事件

事件處理函數 綁定事件 綁定事件的處理函數&#xff08;事件本身是存在的&#xff0c;綁定的是相應的反饋&#xff09;事件 事件的反饋 前端交互 &#xff08;前端核心&#xff09; 綁定事件的方式 1. 句柄綁定 默認&#xff08;只能&#xff09;是事件冒泡這種事件流為…

javascript --- XHR(XMLHttpRequet)對象

XHR: // XHR(XMLHttpRequest):為向服務器發送請求和解析服務器響應提供了流暢的接口 // 能夠以異步方式從服務器取得更多信息,意味著用戶點擊后,可以不必刷新頁面也能取得新數據 // 換句話說,可以使用XHR對象獲取新數據,然后再通過DOM將新數據插入到頁面中.XMLHttpRequest對象…

DOM-8 【兼容】冒泡捕獲流、事件與事件源對象、事件委托

事件流 1. 含義 描述從頁面中接收事件的順序 2. 分類 IE提出的 事件冒泡流 Event BubblingNetscape提出的 事件捕獲流 Event Capturing 3. 階段 事件捕獲階段 處于目標階段 事件冒泡階段 事件捕獲先于事件冒泡執行 dom dom0&#xff1a;定義句柄方式&#xff0c;兼…

IIS6.0,Apache低版本,PHP CGI 解析漏洞

IIS6.0解析漏洞 在IIS6.0下存在這樣的文件“名字.asp;名字.jpg” 代表了jpg文件可以以asp腳本類型的文件執行。 根據這個解析漏洞我們可以上傳這種名字類型的圖片&#xff0c;比如 1.asp;xxx.jpg 他會忽略;后邊的內容&#xff0c;所以文件相當于1.asp asp一句話木馬 <%eval …

UVA 3485 Bridge

題目大意 你的任務是修建一座大橋。橋上等距地擺放著若干個塔&#xff0c;塔高為H&#xff0c;寬度忽略不計。相鄰兩座塔之間的距離不能超過D。塔之間的繩索形成全等的對稱拋物線。橋長度為B&#xff0c;繩索總長為L&#xff0c;如下圖所示求建最少的塔時繩索的最下端離地的高度…

javascript --- XMLHttp2級、CORS(跨域資源共享)

FormData: // 為序列化表單以及創建與表單格式相同的數據提供了便利 var data new FromData(); data.append("name", "Nicholas");// 使用FormData標準化數據后,發送到服務器 var xhr createXHR(); xhr.onreadystatechange function () {if ( xhr.read…

ES5-拓展 this指向的總結

每個函數在執行時都有自己的this指向 1. 默認綁定規則&#xff1a; 全局中&#xff0c;this指向window this window函數的獨立調用&#xff0c;this默認指向window &#xff08;不要把獨立調用理解成window調用&#xff09; // 函數在全局中調用&#xff0c;也就是被window調…

Applet

Applets用于為Web應用程序提供交互功能&#xff0c;這些功能無法單獨由HTML提供。它們可以捕獲鼠標輸入&#xff0c;并且還具有按鈕或復選框等控件。響應于用戶動作&#xff0c;小應用程序可以改變提供的圖形內容。這使得小程序非常適合演示&#xff0c;可視化和教學。 一個app…

國內初創企業選擇云計算服務器價格對比

假設我們是一家初創企業&#xff0c;現在要選擇第一臺服務器。業務還未確定&#xff0c;只知道是互聯網業務 要求&#xff1a; 至少2核&#xff0c;否則多線程的軟件都跑不了至少4G內存&#xff0c;這樣可以運行數據庫或者elasticsearch這種比較吃內存的東西。或者說&#xff0…

javascript --- 幾個其他的跨域技術(圖像Ping、JSONP、Comet)

在CORS(Cross-Origin Resource Sharing,跨域資源共享)出現以前,要實現跨域Ajax通信是很難的. 可以利用DOM中能夠執行跨域請求的功能,來實現跨域通信: 瀏覽器到服務器的單向通信: 此項技術稱為圖像Ping,利用的是img.src的跨域事件 img.src只能通過偵聽load和error事件來確定瀏覽…