模板初階詳解

目錄

  • 泛型編程
  • 函數模板
    • 函數模板概念
    • 函數模板格式
    • 函數模板的原理
    • 函數模板的實例化
      • 隱式實例化
        • 強制類型轉換的疑惑
      • 顯式實例化
    • 模板參數的匹配原則
  • 類模板
    • 類模板的定義格式
    • 類模板的實例化

感謝各位大佬對我的支持,如果我的文章對你有用,歡迎點擊以下鏈接
🐒🐒🐒 個人主頁
🥸🥸🥸 C語言
🐿?🐿?🐿? C語言例題
🐣🐣🐣 python
🐓🐓🐓 數據結構C語言
🐔🐔🐔 C++
🐿?🐿?🐿? 文章鏈接目錄

泛型編程

下面是實現各種類型的交換函數

void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}void Swap(double& left, double& right)
{double temp = left;left = right;right = temp;
}void Swap(char& left, char& right)
{char temp = left;left = right;right = temp;
}

上面函數功能完全相同,只是傳入的參數類型不同,如果我們在要一一實現的話就太麻煩了,所以如果有一個公用的模板,可以支持不同類型的傳參就好了

函數模板

函數模板概念

函數模板代表了一個函數家族,該函數模板與類型無關,在使用時被參數化,根據實參類型產生函數的特定類型版本

函數模板格式

template<typename T1, typename T2,......,typename Tn>這里的T1..代表類型

用函數模板實現交換功能如下

template<typename T>
void Swap( T& left, T& right)
{T temp = left;left = right;right = temp;
}

在這里插入圖片描述
T代表所有的類型,所以也可以交換char類型的變量
在這里插入圖片描述

注意:typename是用來定義模板參數關鍵字,也可以使用class(切記:不能使用struct代替class)

函數模板的原理

上面的模板中不同類型的變量都調用了Swap,現在有一個問題就是Swap(a,b)和Swap(c,d)是否用的同一個Swap函數

事實上他們調用的并不是同一個Swap函數,因為a b的類型和c d的類型是不一樣的,也就是函數模版中的T是未知類型,根據傳入參數類型生成一個匹配的函數

函數模板的實例化

用不同類型的參數使用函數模板時,稱為函數模板的實例化。模板參數實例化分為:隱式實例化和顯式實例化。

隱式實例化

讓編譯器根據實參推演模板參數的實際類型

在上面已經演示過一個例子了
在這里插入圖片描述
但是如果我們傳入的參數不符合模板規定就會報錯
在這里插入圖片描述
這里的Swap模板中的T只能表示一種類型,而我們傳入的參數中包含了int類型和double類型,也就是說T的類型即是int也是double,顯然這是不可能的,所以出現參數T不明確這個錯誤

解決方案有三種,第一種是強制類型轉換,第二種就是顯示實例化,第三種就是用多個不同的T(T1 T2 T3…)

強制類型轉換的疑惑

但是關于強制類型轉換這里我有一點疑惑

void Swap(T& left, T& right)
{T temp = left;left = right;right = temp;
}
int main()
{int a = 1, b = 2;double c = 1.001, d = 2.001;Swap(a, b);Swap((int)c, a);cout << a << "\n" << b << endl;cout << c << "\n" << d << endl;return 0;
}

在這里插入圖片描述
按理來說強制類型轉換后參數類型就相同了,并且就算double類型和int類型數據進行交換,也應該只是出現數據丟失這種情況,但是不會報錯,而這里卻出現了問題,所以我不是很清楚

而再看看下面這個例子,在沒有強制類型轉換前是報錯的,而強制類型轉換后可以正常運行
在這里插入圖片描述
在這里插入圖片描述

顯式實例化

在函數名后的<>中指定模板參數的實際類型

template<typename T1>
T1 ADD(const T1& left, const T1 right)
{return left + right;
}
int main()
{int a = 1;double b = 2.001;cout << ADD<int>(a, b) << endl;cout << ADD<double>(a, b) << endl;return 0;
}

在這里插入圖片描述
Swap函數還是會報錯,但是后面我發現了一句話:如果類型不匹配,編譯器會嘗試進行隱式類型轉換,如果無法轉換成功編譯器將會報錯,可能是因為這個才報錯的
在這里插入圖片描述
但是第三中方法是可以解決這個問題的

template<typename T1,typename T2>
T1 ADD(const T1& left, const T2 right)
{return left + right;
}
int main()
{int a = 1;double b = 2.001;cout << ADD(a, b) << endl;return 0;
}

這里會出現數據丟失,所以輸出的結果是3
在這里插入圖片描述
再來看看Swap會不會報錯

template<typename T,typename T1>
void Swap(T& left, T1& right)
{T temp = left;left = right;right = temp;
}int main()
{int a = 1, b = 2;double c = 1.001, d = 2.001;Swap(a, b);Swap(c, a);cout << a << "\n" << b << endl;cout << c << "\n" << d << endl;return 0;
}

c之所以等于2是因為c在交換前,a和b已經交換了,所以c在和a交換的時候其實是1.001和2交換
而a之所以等于1,是因為在c和a交換后,a為1.001,然后因為a是int類型導致數據丟失
在這里插入圖片描述

模板參數的匹配原則

template<typename T>
T ADD(const T& left, const T& right)
{return left + right;
}
int ADD(const int& left, const int& right)
{return left + right;
}
int main()
{int a = 1, b = 2;cout << ADD(a, b) << endl;return 0;
}

這段代碼可以正常運行,但是現在又一個問題就是兩個ADD函數,一個是通用模板,另一個是現成的函數,到底是用的哪一個呢?
在這里插入圖片描述

顯然為偷懶,當然是用現成的函數,所以我們調用的函數是先從的ADD函數

而下面這種就不是調用現成的ADD函數了,因為這里用了顯示實例化,也就表示了你必須調用模板函數,讓T變成int類型,即使有現成的函數也不可以偷懶

在這里插入圖片描述

類模板

類模板的定義格式

template<class T1, class T2, ..., class Tn> 
class 類模板名
{// 類內成員定義
};

類模板的實例化

來看看下面的例子

template<typename T>
class A
{
public:T ADD(const T& left, const T& right){return left + right;}
private:T a;int b;
};
int main()
{int c = 0, d = 2;double e = 0.0001, f = 1.0001;A <int>a;A<double>b;cout << a.ADD(c, d) << endl;cout << b.ADD(e, f) << endl;return 0;
}

類模版的實例化都是顯示實例化,也就是在定義的時候我們就要規定T是什么類型,例如A < int> a表示這a這個對象中T是int類型,其次類中的函數也是和之前的模板函數一樣的
在這里插入圖片描述

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

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

相關文章

微信小程序接口wx.getLocation違規導致封禁解決辦法

1、找到站內信的這個封禁的通知&#xff08;功能封禁的通知&#xff0c;而不是處理警告的通知&#xff09; 2、點擊通知會有申訴鏈接&#xff0c;點開申訴鏈接 申訴原因可參考下面的內容&#xff1a; 1.小程序哪些板塊已除去收集地理位置、2.哪些板塊需要收集地理位置、3.詳細…

寶塔內 計劃任務更新遠程主機的時間

很多情況下一些主機無法上網,長此以往有可能讓系統內的時間混亂 ,這是一個很愁人的事情 這里我們找了一個可以通過寶塔的計劃任務或 cron 不斷將本地時間通過ssh登錄,并在登錄狀態下設置時間的方法.找了很多方案都不行 .最終采用了私鑰登錄的方案 1 使用寶塔的計劃任務(可選): …

WindowsMac共享文件夾設置

共享文件夾設置 共享文件夾設置Windows系統設置步驟一&#xff1a;設置共享文件夾步驟二: 訪問共享文件夾 Mac系統中設置共享文件夾步驟一&#xff1a;設置共享文件夾步驟二&#xff1a;訪問共享文件夾 小貼士結論 共享文件夾設置 有時需要在多臺電腦之間共享文件夾&#xff0…

4.MkDocs樣式

學習 Admonitions(警告) - Material for MkDocs (wdk-docs.github.io) 提示 - Material for MkDocs 中文文檔 (llango.com) Buttons(按鈕) - Material for MkDocs (wdk-docs.github.io) 建議去看這些網站&#xff0c;更為詳細。 常用功能 便利貼 ?? 開啟 markdown_ex…

Linux筆記之iftop查看特定IP地址吞吐量

Linux筆記之iftop查看特定IP地址吞吐量 code review! 文章目錄 Linux筆記之iftop查看特定IP地址吞吐量一.iftop安裝與監控二.iftop 界面簡單介紹如何查看單位實時流量的顯示形式控制單位顯示示例 三.數據存儲和傳輸的單位&#xff1a;比特&#xff08;bit&#xff09;和字節&…

Gemma2——Google 新開源大型語言模型完整應用指南

0.引言 Gemma 2以前代產品為基礎&#xff0c;提供增強的性能和效率&#xff0c;以及一系列創新功能&#xff0c;使其在研究和實際應用中都具有特別的吸引力。Gemma 2 的與眾不同之處在于&#xff0c;它能夠提供與更大的專有模型相當的性能&#xff0c;但其軟件包專為更廣泛的可…

hdfs大規模數據存儲底層原理詳解(第31天)

系列文章目錄 一、HDFS設計原理 二、HDFS系統架構 三、HDFS關鍵技術 四、HDFS應用實例 五、解決HDFS不能處理小文件詳解問題 文章目錄 系列文章目錄前言一、設計原理二、系統架構三、關鍵技術四、應用實例五、解決HDFS不能處理小文件詳解問題1. 合并小文件2. 優化Hive配置3. 使…

DDR3 SO-DIMM 內存條硬件總結(一)

最近在使用fpga讀寫DDR3&#xff0c;板子上的DDR3有兩種形式與fpga相連&#xff0c;一種是直接用ddr3內存顆粒&#xff0c;另一種是通過內存條的形式與fpga相連。這里我們正好記錄下和ddr3相關的知識&#xff0c;先從DDR3 SO-DIMM 內存條開始。 1.先看內存條的版本 從JEDEC下載…

Mysql練習題目【7月10日更新】

七、Mysql練習題目 https://zhuanlan.zhihu.com/p/38354000 1. 創建表 創建學生表 mysql> create table if not exists student(-> student_id varchar(255) not null,-> student_name varchar(255) not null,-> birthday date not null,-> gender varchar(…

前端面試題33(實時消息傳輸)

前端實時傳輸協議主要用于實現實時數據交換&#xff0c;特別是在Web應用中&#xff0c;它們讓開發者能夠構建具有實時功能的應用&#xff0c;如聊天、在線協作、游戲等。以下是幾種常見的前端實時傳輸協議的講解&#xff1a; 1. Short Polling (短輪詢) 原理&#xff1a;客戶…

【1】A-Frame整體介紹

1.A-Frame是什么&#xff1f; A-Frame 是一個用于構建虛擬現實 (VR) 體驗的 Web 框架。 A-Frame 基于 HTML 之上&#xff0c;因此上手簡單。但 A-Frame 不僅僅是 3D 場景圖或標記語言&#xff1b;它還是一種標記語言。其核心是一個強大的實體組件框架&#xff0c;為 Three.js …

Golang | Leetcode Golang題解之第226題翻轉二叉樹

題目&#xff1a; 題解&#xff1a; func invertTree(root *TreeNode) *TreeNode {if root nil {return nil}left : invertTree(root.Left)right : invertTree(root.Right)root.Left rightroot.Right leftreturn root }

AI機器人在未來的應用場景預測:是否會取代人類?華為、百度、特斯拉他們在AI領域都在做什么?

引言 隨著人工智能&#xff08;AI&#xff09;技術的飛速發展&#xff0c;AI機器人在各個領域的應用變得越來越普遍。從工業自動化到日常生活&#xff0c;AI機器人已經開始展現出強大的潛力和實際應用價值。本文將深入探討AI機器人在未來的應用場景&#xff0c;并分析它們是否…

uniapp+vue3嵌入Markdown格式

使用的庫是towxml 第一步&#xff1a;下載源文件&#xff0c;那么可以git clone&#xff0c;也可以直接下載壓縮包 git clone https://github.com/sbfkcel/towxml.git 第二步&#xff1a;設置文件夾內的config.js&#xff0c;可以選擇自己需要的格式 第三步&#xff1a;安裝…

大模型/NLP/算法面試題總結3——BERT和T5的區別?

1、BERT和T5的區別&#xff1f; BERT和T5是兩種著名的自然語言處理&#xff08;NLP&#xff09;模型&#xff0c;它們在架構、訓練方法和應用場景上有一些顯著的區別。以下是對這兩種模型的詳細比較&#xff1a; 架構 BERT&#xff08;Bidirectional Encoder Representation…

【Web前端】JWT(JSON Web Tokens)概述

1、簡介 JWT&#xff08;JSON Web Tokens&#xff09;是一種用于雙方之間安全傳輸信息的簡潔的、URL安全的令牌標準。 它基于JSON對象&#xff0c;并通過數字簽名確保其完整性和真實性。 JWT因其小巧、自包含以及易于在客戶端和服務器之間傳輸的特性而被廣泛使用于身份驗證和…

python字符串驗證從基礎到進階的總結

引言 在數據處理和文本挖掘中&#xff0c;對字符串的驗證是確保數據符合特定要求的關鍵步驟之一。其中一個常見的驗證需求是確認字符串是否只包含字母。Python為此提供了多種實現的方法&#xff0c;我們將逐一討論它們。 方法1&#xff1a;使用 isalpha() 方法 def is_all_l…

UML 2.5圖的分類

新書速覽|《UML 2.5基礎、建模與設計實踐》新書速覽|《UML 2.5基礎、建模與設計實踐 UML 2.5在UML 2.4.1的基礎上進行了結構性的調整&#xff0c;簡化和重新組織了 UML規范文檔。UML規范被重新編寫&#xff0c;使其“更易于閱讀”&#xff0c;并且“盡可能減少前向引用”。 U…

php簡單實現利用飛書群里機器人推送消息的方法

這是一篇利用的飛書的自定義機器人&#xff0c;將系統中的錯誤信息推送給技術群的功能代碼示例。 飛書文檔地址&#xff1a;開發文檔 - 飛書開放平臺 自定義機器人只能在群聊中使用的機器人&#xff0c;在當前的群聊中通過調用webhook地址來實現消息的推送。 配置群邏輯可以看…

LLM應用構建前的非結構化數據處理(三)文檔表格的提取

1.學習內容 本節次學習內容來自于吳恩達老師的Preprocessing Unstructured Data for LLM Applications課程&#xff0c;因涉及到非結構化數據的相關處理&#xff0c;遂做學習整理。 本節主要學習pdf中的表格數據處理 2.環境準備 和之前一樣&#xff0c;可以參考LLM應用構建前…