模板概述

???? 模板,按建筑學的說法是:施工時澆筑混凝土用的成組模型板;而模板之詞,恐怕可釋之為模型之板,顧名思義,模板為一套規定好了規范準則的樣板。既然為樣板,自然是可被多方使用;而準則既已定好,那么限制亦是必然存在呢。程序界中的模板,原義也應取于此。模板所用之樣板根據模板的不同可為實現了一定算法的函數,也可為規定好了內部數據結構和操作的類;而所施加之限制則為合乎模板定義的類型參數。至于模板定義的類型參數,不外乎:數目相同、操作完備呢。
???? 模板按其使用,可歸結為兩大類:函數模板和類模板。函數模板和普通函數相比,可謂異曲同工。普通函數也算得上是一種模板,只是施加于普通函數上的限制嚴格于函數模板而已。普通函數實現了基本的算法,調用函數時,需提供相同數目,相同類型的實參來代替形參。而模板函數除了要求參數的數目相同外,將形參的類型作了放大,因而其使用范圍也隨之變大。模板函數的實參類型只需要具有形參類型所必須的操作即可。
???? 下面的例子定義了三個函數:
?1None.gif//max.h
?2None.gif#include?<iostream>
?3None.giftemplate?<typename?T>
?4ExpandedBlockStart.gifContractedBlock.gifinline?T?const&?max(T?const&?a,T?const&?b)dot.gif{
?5InBlock.gif????std::cout<<"你調用的是兩個參數的模板函數!"<<std::endl;
?6InBlock.gif????return?a>b?a:b;
?7ExpandedBlockEnd.gif}

?8None.gif
?9None.giftemplate?<typename?T1,typename?T2>
10ExpandedBlockStart.gifContractedBlock.gifinline?T1?const&?max(T1?const&?a,T2?const&b)dot.gif{
11InBlock.gif????std::cout<<"你調用的是兩個參數的模板函數,且參數類型不同!"<<std::endl;
12InBlock.gif????return?a>b?a:b;
13ExpandedBlockEnd.gif}

14None.gif
15ExpandedBlockStart.gifContractedBlock.gifinline?int?const&?max(int?const&?a,int?const&?b)dot.gif{
16InBlock.gif????std::cout<<"你調用的是兩個參數的普通函數!"<<std::endl;
17InBlock.gif????return?a>b?a:b;
18ExpandedBlockEnd.gif}

19None.gif
20None.giftemplate?<typename?T>
21ExpandedBlockStart.gifContractedBlock.gifinline?T?const&?max(T?const&?a,?T?const&?b?,T?const&?c)dot.gif{
22InBlock.gif????std::cout<<"你調用的是三個參數的模板函數!"<<std::endl;
23InBlock.gif????T?d;
24InBlock.gif????d=a>b?a:b;
25InBlock.gif????return?d>c?d:c;
26ExpandedBlockEnd.gif}

27None.gif
???? 其中,第一和第三個函數都為模板函數,而第二個函數為普通函數。下面的代碼使用這些函數:
?1None.gif#include?<iostream>
?2None.gif#include?<string>
?3None.gif#include?"max.h"
?4None.gif
?5ExpandedBlockStart.gifContractedBlock.gifint?main()dot.gif{
?6InBlock.gif????int?i=42;
?7InBlock.gif????std::cout<<"max(7,i)?is?"<<::max(7,i)<<std::endl;
?8InBlock.gif
?9InBlock.gif????double?f1=3.45;
10InBlock.gif????double?f2=-9.34;
11InBlock.gif????std::cout<<"max(f1,f2)?is"<<::max(f1,f2)<<std::endl;
12InBlock.gif????
13InBlock.gif????//下面的兩行代碼是正確的,前者明確指明參數的類型;后者通過類型轉換都使得代碼能正確運行。
14InBlock.gif????std::cout<<"max(f1,i)?is"<<::max<double>(f1,i)<<std::endl;
15InBlock.gif????std::cout<<"max(f1,i)?is"<<::max(f1,static_cast<double>(i))<<std::endl;
16InBlock.gif
17InBlock.gif????std::cout<<"max(f1,f2,f3)"<<::max(12.0,13.0,11.5)<<std::endl;
18InBlock.gif????std::cout<<"max(char,int)"<<::max('a',12)<<std::endl;
19InBlock.gif????std::cout<<"max(f1,i)?is"<<::max(f1,i)<<std::endl;
20InBlock.gif????std::cout<<"max(int,int)"<<::max<double>(12,34)<<std::endl;
21InBlock.gif????std::cin>>i;
22ExpandedBlockEnd.gif}

???? 通過上面的代碼的運行結果,我們可以發現第14行的代碼調用的都是普通函數版本的max函數,而第18、19行的代碼調用的是兩個參數類型不同的模板函數。
???? 上面的代碼說明了模板函數的定義、模板函數的重載和使用等方面的問題,比較有意思的是模板函數的重載。和普通函數一樣,模板函數也能重載,可以為模板函數定義參數數目不同的重載函數,也可以定義數目相同但參數類型不同的重載函數,而普通函數我們也可以當作是指定了具體類型的模板函數來處理。經過這樣的處理,我們可以看出,模板函數的重載和普通函數的重載方式大同小異。
???? 說完了模板函數的重載,我們再談談重載模板函數的使用,使用模板函數時,采用最符合原則進行調用,這也是為什么第14行的代碼調用的是普通函數,而18,19行的代碼調用的是兩個參數類型不同的模板函數的原因。如果我們將第18,19行代碼調用的模板函數去掉,那么代碼仍然可以運行,其調用的將是普通函數,因為char和float都可以轉換為int,最符合的函數原型是普通函數。
????說完了函數模板,該談談模板類了,可惜肚子開始呱呱叫了,只好下回分解呢。?
???? 我們繼續前面的話題。模板函數還是十分簡單的,模板類則復雜的多。同模板函數一樣,也能對模板類實施重載。當然,對類而言,使用重載似乎不是那么合適了,因而我們使用專門的詞來稱呼-專門化(Specialization)。而這種specialization,同模板函數重載一樣,可以是完全specialization,也可是部分specialization(partial specialization),其實我們完全可以沿用前面處理函數的觀點,將普通類(完全specialization的類)當作是一種特殊的模板類,那樣無論是何種specialization,事實上都是模板類,只是類型參數的限制不同而已。如果進行這樣的統一以后,對于重載模板類的定義、使用就同模板函數完全一致了,這里就不再多費口舌了。
???? 模板類有一個模板函數不具有的特性-默認參數類型。模板類的類型參數設定時可以給出默認類型,使用的時候如果對于該參數不給出實參類型,將使用默認類型代替形參類型,這同函數中的默認參數值是一樣的,不過模板函數是不允許這樣做的。

轉載于:https://www.cnblogs.com/lotusswan/archive/2005/09/01/227727.html

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

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

相關文章

我憑什么拿到了阿里、騰訊、今日頭條3家大廠offer?通用流行框架大全

前言 從畢業到現在面試也就那么幾家公司&#xff0c;單前幾次都比較順利&#xff0c;在面到第三家時都給到了我offer&#xff01;前面兩次找工作&#xff0c;沒考慮到以后需要什么&#xff0c;自己的對未來的規劃是什么&#xff0c;只要有份工作&#xff0c;工資符合自己的要求…

解決讀寫分離過期讀的幾個方案

mysql讀寫分離的坑 讀寫分離的主要目標是分攤主庫的壓力&#xff0c;由客戶端選擇后端數據庫進行查詢。還有種架構就是在MYSQL和客戶端之間有一個中間代理層proxy&#xff0c;客戶端之連接proxy&#xff0c;由proxy根據請求類型和上下文決定請求的分發路由。 客戶端直連方案&am…

Feign接口 多線程問題

Spring Cloud Feign傳輸Header&#xff0c;并保證多線程情況下也適用 一、現象 微服務在生產中&#xff0c;常遇到需要把 header 傳遞到下一子服務的情況&#xff08;如服務A訪問服務B的接口&#xff0c;需要傳遞header&#xff09;&#xff0c;網上大多數的方案是實現 Request…

serial port 的操作

import serial①選擇設備serserial.Serial("/dev/ttyUSB0",9600,timeout0.5) #使用USB連接串行口serserial.Serial("/dev/ttyAMA0",9600,timeout0.5) #使用樹莓派的GPIO口連接串行口serserial.Serial(1,9600,timeout0.5)#winsows系統使用com1口連接串行口s…

我在華為做Android外包的真實經歷!吊打面試官系列!

導語 本部分內容是關于Android進階的一些知識總結&#xff0c;涉及到的知識點比較雜&#xff0c;不過都是面試中幾乎常問的知識點&#xff0c;也是加分的點。 關于這部分內容&#xff0c;可能需要有一些具體的項目實踐。在面試的過程中&#xff0c;結合具體自身實踐經歷&…

logstash windows

最新在研究elastic stack (elk) &#xff1a; logstash 安裝&#xff0c;下載最新版本的logstash: 點擊打開鏈接 解壓到磁盤根目錄下&#xff1a;在logstash>bin 1、目錄下創建&#xff1a;logstash.conf 2、輸入內容: # Sample Logstash configuration for creating …

H3C端口狀態

轉載于:https://www.cnblogs.com/fanweisheng/p/11153315.html

還有人不知道什么是AndroidX的嗎?文末領取面試資料

談起Android框架體系架構&#xff0c;我先提個問&#xff1a;什么是Android框架體系架構 &#xff1f; Android系統構架是安卓系統的體系結構&#xff0c;android的系統架構和其操作系統一樣&#xff0c;采用了分層的架構&#xff0c;共分為四層&#xff0c;從高到低分別是And…

zookeeper+kafka+logstash+elasticsearc+kibana

研究背景 1、之所以選用kafka是因為量起來的話單臺logstash的抗壓能力比較差 2、為了解決整個鏈路查詢的問題&#xff0c;多個Feign傳層的話&#xff0c;可以按照一個ID進行穿層&#xff0c;所以采用logback的MDC進行對唯一標識存儲并且在Feign的調用鏈放在Header里&#xff…

還沒吃透內存緩存LruCache實現原理的看這篇文章,跳槽薪資翻倍

目前情況&#xff1a;10屆某民辦大學本科生&#xff0c;實際接觸Android年限6年多了&#xff0c;工作年限五年半&#xff08;注意&#xff0c;我說的是工作年限&#xff0c;不是工作經驗&#xff09;&#xff0c;今年1月份裸辭后歇了大半年&#xff0c;經常一周也收不到幾個off…

利用 Docker 搭建單機的 Cloudera CDH 以及使用實踐

利用 Docker 搭建單機的 Cloudera CDH 以及使用實踐 想用 CDH 大禮包&#xff0c;于是先在 Mac 上和 Centos7.4 上分別搞個了單機的測試用。其實操作的流和使用到的命令差不多就一并說了: 首先前往官方下載包&#xff1a; https://www.cloudera.com/downloads/quickstart_vm…

前端有用JavaScript技巧

數組去重 var arr [1, 2, 3, 3, 4];console.log(...new Set(arr))// [1, 2, 3, 4] 數組和布爾值 有時我們需要過濾數組中值為 false 的值. 例如(0, undefined, null, false) var myArray [1, 0 , undefined, null, false];myArray.filter(Boolean);//[1] 合并對象 const page…

還沒吃透內存緩存LruCache實現原理的看這篇文章,面試必會

前言 這篇文章主要是分享今年上半年的面試心得&#xff0c;現已就職于某大廠有三個月了&#xff0c;近期有很多公司均已啟動秋招&#xff0c;也祝大家在 2020 的下半年面試順利&#xff0c;獲得理想的offer&#xff01; 之前找工作的那段時間感想頗多&#xff0c;總結一點面試…

fastjson反序列化漏洞原理及利用

重要漏洞利用poc及版本 我是從github上的參考中直接copy的exp&#xff0c;這個類就是要注入的類 import java.lang.Runtime; import java.lang.Process; public class Exploit { public Exploit() { try{ // 要執行的命令 String commands "calc.exe"; Process pc …

這個回答讓我錯失offer!offer拿到手軟

開頭 每到“金三銀四”的季節&#xff0c;總人很多人去尋找名叫“面經”一樣的東西&#xff0c;其實就是一個個具體的題目&#xff0c;然后臨陣磨槍&#xff0c;去“背”答案&#xff0c;如果一直是這樣的話&#xff0c;我相信你的能力不會有任何提高&#xff0c;即使工作三年…

Spark Windows

本文主要是講解Spark在Windows環境是如何搭建的 一、JDK的安裝 1、1 下載JDK 首先需要安裝JDK&#xff0c;并且將環境變量配置好&#xff0c;如果已經安裝了的老司機可以忽略。JDK&#xff08;全稱是JavaTM Platform Standard Edition Development Kit&#xff09;的安裝&…

ts

ts文件中使用以下注釋來臨時忽略規則出現的錯誤。如在定義變量是為定義類型就報錯誤 // tslint:disable——忽略該行以下所有代碼出現的錯誤提示// tslint:enable——當前ts文件重新啟用tslint// tslint:disable-line——忽略當前行代碼出現的錯誤提示// tslint:disable-next-l…

這個回答讓我錯失offer!成功收獲美團,小米安卓offer

前言 我們移動開發程序員應該首先明白一個要點&#xff0c;能夠學習的東西可以區分為『知識』和『技能』。 知識&#xff0c;就是你知道就知道、不知道就不知道的東西&#xff0c;比如『計算機系統中一個字節是包含8個bit』&#xff0c;你知道了之后就算掌握了。 技能&#…

vue 雙數據綁定原理

Vue的雙向數據綁定原理是什么&#xff1f; 答&#xff1a;vue.js 是采用數據劫持結合發布者-訂閱者模式的方式&#xff0c;通過Object.defineProperty()來劫持各個屬性的setter&#xff0c;getter&#xff0c;在數據變動時發布消息給訂閱者&#xff0c;觸發相應的監聽回調。 具…

Java lamda表達式快速分組

public class ProductDto {private long month;private String cate;private double count;} 分組 Map<String,List<ProductDto>> categoryMap alllist.getValue().stream().collect(Col lectors.groupingBy(ProductDto::getCate));求和 Double sumCount catego…