C++ 泛型編程:函數模板

文章目錄

  • 前言
  • 一、什么是泛型編程
  • 二、函數模板
  • 三、函數模板的使用
  • 四、多參數函數模板
  • 五,示例代碼:
  • 總結

前言

當需要編寫通用的代碼以處理不同類型的數據時,C++ 中的函數模板是一個很有用的工具。函數模板允許我們編寫一個通用的函數定義,可以用于多種不同的數據類型,從而提高代碼的重用性和靈活性。


一、什么是泛型編程

泛型編程 是一種編程范式,旨在實現可重用、通用性高的代碼。它允許我們編寫與特定數據類型無關的代碼,使代碼能夠適用于多種不同的數據類型。

  1. 傳統的編程 方法主要依賴于特定的數據類型,需要為每個數據類型編寫特定的代碼。
  2. 泛型編程中,我們使用泛型類型來表示不特定的數據類型,可以在代碼中使用泛型類型作為參數、變量或返回類型。使用泛型類型,我們可以編寫通用的算法和數據結構,使其能夠適用于不同的數據類型。

泛型編程的核心概念是模板。模板是一種代碼生成機制,可以根據具體的數據類型生成對應的代碼。C++中的模板可以是函數模板或類模板。函數模板允許我們定義通用的函數,而類模板允許我們定義通用的類。

二、函數模板

  1. 函數模板 概念:
  • 一種特殊的函數 可用不同類型去調用。
  • 看起來喝普通的函數相似,區別是類型可被參數化
  1. 函數模板規則:
    template 關鍵字用于聲明開始進行泛型編程
    typename 關鍵字用于聲明泛指類型.
    T 是泛指任意的數據類型。

下面是一個 用于交換 數據的函數模板。
在這里插入圖片描述

三、函數模板的使用

  • 自動類型推導調用。
    自動推導類型時,必須嚴格匹配。
int a = 1;
int b = 2;Swap(a, b);					// 自動推導
  • 具體類型顯示調用。
    顯示類型指定時,能夠進行隱式類型轉化。
    顯式指定函數模板的參數類型,而不是依賴編譯器的類型推導。這可以通過在函數調用中使用尖括號來實現.
float c = 2.1;
float d = 3.1;Swap<float>(c, d);				// 顯示調用

四、多參數函數模板

多參數函數模板 就是 函數模板定義任意多個不同的參數類型。

對于多參數模板, 無法自動推導返回值的類型。可以從左到右 部分指定類型參數。
工程中 將第一個類型參數 作為 返回值參數類型。
在這里插入圖片描述
例如:計算 a ,b 之和。

using namespace std;template <typename T1, typename T2, typename  T3>
T1 Add(T2 a, T3 b)
{return static_cast<T1>(a+b);
}int main(void)
{// T1 = int, T2 = double, T3 = doubleint r1 = Add<int>(0.6, 0.7);						// 第一個參數類型 作為 返回值類型,從左往右推// T1 = double, T2 = float, T3 = doubledouble r2 = Add<double, float>(0.6, 0.7);// T1 = float, T2 = float, T3 = floatfloat r3 = Add<float, float, float>(0.6, 0.7);cout << "r1 = " << r1 << endl;cout << "r2 = " << r2 << endl;cout << "r3 = " << r3 << endl;return 0;
}

在這里插入圖片描述
注意
當 函數模板遇到了 普通函數,C++ 編譯器優先選擇 普通函數。如果函數模板可以產生更厚的匹配,則選擇模板。可以通過 < > 限定編譯器只匹配模板。

五,示例代碼:

通過下面的例子進一步講解:
使用 函數模板 分別對整形數組 和 字符串數組 進行排序 打印。

using namespace std;template <typename T>						// 函數模板:交換數據
void Swap(T& a, T& b)
{T c = a;a = b;b = c;
}template<typename T>
void Sort(T a[], int len)					// 函數模板:數組元素排序
{for (int i = 0; i < len; i++){for (int j = i; j < len; j++){if (a[i] > a[j])Swap(a[i],a[j]);}}
}int main(void)
{int a[5] = {3,5,1,2,4};for (int i = 0; i < 5; i++)cout << a[i] << ",";cout << endl;Sort(a,5);											// 數組元素排序for (int j = 0; j < 5; j++)cout << a[j] << ",";cout << endl;string s[5] = { "Java", "C++", "Pascal", "Ruby", "Basic" };for (int k = 0; k < 5; k++)cout << s[k] << ",";cout << endl;Sort(s, 5);											// 字符串 數組排序for (int n = 0;n < 5;n++)cout << s[n] << ",";cout << endl;return 0;
}

在這里插入圖片描述


總結

以上是對C++函數模板的詳細解析。函數模板提供了一種強大的機制,可以編寫與數據類型無關的通用代碼,從而提高代碼的重用性和靈活性,以及更好地支持泛型編程。

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

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

相關文章

Vue day02 Computed和Watch

1.事件綁定 可以用 v-on 指令監聽DOM 事件&#xff0c;并在觸發時運行一些 JavaScript 代碼。v-on 還可以接收一個需要調用的方法名稱。 <button v-on:click"handler">good</button> methods: { handler: function (event) { if (event) { alert(event.t…

接口測試之Jmeter+Ant+Jenkins接口自動化測試平臺

平臺簡介 一個完整的接口自動化測試平臺需要支持接口的自動執行&#xff0c;自動生成測試報告&#xff0c;以及持續集成。Jmeter支持接口的測試&#xff0c;Ant支持自動構建&#xff0c;而Jenkins支持持續集成&#xff0c;所以三者組合在一起可以構成一個功能完善的接口自動化…

BOLT- 識別和優化熱門的基本塊

在BOLT中&#xff0c;識別和優化熱門的基本塊之所以關鍵&#xff0c;是因為BOLT的主要目標是優化程序以更好地利用硬件特性&#xff0c;特別是指令緩存&#xff08;ICache&#xff09;。以下是BOLT如何識別和優化熱門基本塊的流程&#xff1a; 收集性能數據: BOLT開始的時候并不…

idea - 刷新 Git 分支數據 / 命令刷新 Git 分支數據

一、idea - 刷新 Git 分支數據 idea 找到 fetch 選項&#xff0c;重新獲取分支數據 二、命令刷新 Git 分支數據 git fetch參考鏈接 1. 遠程Gitlab新建的分支在IDEA里不顯示

jxls導出問題

![請添加圖片描述](https://img-blog.csdnimg.cn/bc74c4207818491c93b75e19b3333451.png 為什么最后導出的文件還是按原樣導出啊&#xff0c;沒有填充數據 ![在這里插入圖片描述](https://img-blog.csdnimg.cn/d4500b9a98c042f6b64a5d0650071303.png

qt多線程使用方式

有5個方式&#xff1a;可以參考這個博客&#xff1a;Qt 中開啟線程的五種方式_qt 線程_lucky-billy的博客-CSDN博客 注&#xff1a;為了實現更加靈活的線程管理&#xff08;因為這5種都有一些不方便之處&#xff1a;QThread需要子類化且不能傳參&#xff0c;moveToThread不能傳…

【leetcode】459. 重復的子字符串(easy)

給定一個非空的字符串 s &#xff0c;檢查是否可以通過由它的一個子串重復多次構成。 示例 1: 輸入: s “abab” 輸出: true 解釋: 可由子串 “ab” 重復兩次構成。 示例 2: 輸入: s “aba” 輸出: false 示例 3: 輸入: s “abcabcabcabc” 輸出: true 解釋: 可由子串 “ab…

ChatGPT等人工智能編寫文章的內容今后將成為常態

BuzzFeed股價上漲200%可能標志著“轉向人工智能”媒體趨勢的開始。 周四&#xff0c;一份內部備忘錄被華爾街日報透露BuzzFeed正計劃使用ChatGPT聊天機器人-風格文本合成技術來自OpenAI&#xff0c;用于創建個性化盤問和將來可能的其他內容。消息傳出后&#xff0c;BuzzFeed的…

ubuntu 20.04 RK3568網絡的優先級設置

1、背景 硬件使用RK3568 CPU&#xff0c;操作系統采用ubuntu 20.04 Lxqt桌面的版本。硬件上具有一個有線以太網卡&#xff0c;一個wifi網卡&#xff0c;一個5G網卡。由于操作系統默認的網絡優先級為有線網卡的最高&#xff0c;5G網卡次之。在一個業務應用中需要5G網卡的連接外…

文本三劍客之grep命令和awk命令 1.0 版本

grep awk 1.grep命令1.1 基本格式1.2 常用選項 2.awk命令2.1 awk工作原理2.2 awk命令格式2.3 awk常用內置變量 1.grep命令 1.1 基本格式 grep [選項]… 查找條件 目標文件1.2 常用選項 選項功能 -m [ x ]匹配x次 后停止,x為具體數字-v取反 -i忽略字符大小寫 -n顯示匹配的 …

Dynamic CRM開發 - 實體介紹

實體簡介 在CRM中,實體(Entity)是數據的基本載體,也是構建業務邏輯網絡的基礎節點。 實體可以理解為數據庫中的一張表(實體中的字段對應數據庫表的字段),比如創建一個實體存儲客戶信息,創建一個實體存儲產品信息,產品實體里可以創建一個查找類型的字段(類似表的外鍵)…

【Express.js】集成RabbitMQ

集成RabbitMQ 本節我們介紹在 express.js 中集成 rabbitmq. RabbitMQ 是一個消息隊列中間件&#xff0c;常用于請求削峰&#xff0c;事務的隊列處理&#xff0c;事件訂閱機制的實現等。 準備工作 創建一個 express.js 項目&#xff08;本文基于evp-express-cli&#xff09;…

【三維編輯】Seal-3D:基于NeRF的交互式像素級編輯

文章目錄 摘要一、引言二、方法2.1.基于nerf的編輯問題概述2.2.編輯指導生成2.3.即時預覽的兩階段學生訓練 三、實驗四、代碼總結 項目主頁: https://windingwind.github.io/seal-3d/ 代碼&#xff1a;https://github.com/windingwind/seal-3d/ 論文: https://arxiv.org/pdf/23…

創建一個Spring Boot項目

安裝所需軟件&#xff1a;首先確保你的計算機上已經安裝了Java JDK和Maven構建工具。你可以從官方網站下載并按照說明進行安裝。 創建一個新的Spring Boot項目&#xff1a;在命令行或終端中使用Maven命令創建一個新的Spring Boot項目。執行以下命令&#xff1a;mvn archetype:…

阿里云輕量應用服務器_2核4G4M_2核2G3M_性能測評

阿里云輕量應用服務器2核2G3M帶寬108元一年&#xff0c;系統盤為50GB高效云盤&#xff1b;輕量服務器2核4G4M帶寬&#xff0c;60GB高效云盤297.98元12個月。目前輕量應用服務器只有2核2G和2核4G有活動&#xff0c;阿里云百科分享阿里云輕量應用服務器入口&#xff1a; 目錄 阿…

【Qt高階】老Qt都不一定清楚的“QObject線程親和性”【2023.08.13】

老Qt都不一定清楚的“線程親和性” 與題目無關 感覺自己還挺2&#xff0c;有粉絲點了那個契約者會給up發個鼓勵的話&#xff0c;我還以為是人私信發的&#xff0c;都挨個感謝了&#xff0c;后來才意識到是系統自動發的&#x1f623;&#x1f623;&#x1f623;。 自上上期視頻對…

Three.js陰影

目錄 Three.js入門 Three.js光源 Three.js陰影 Three.js紋理貼圖 使用燈光后&#xff0c;場景中就會產生陰影。物體的背面確實在黑暗中&#xff0c;這稱為核心陰影&#xff08;core shadow&#xff09;。我們缺少的是落下的陰影&#xff08;drop shadow&#xff09;&#…

【數據結構】——棧、隊列的相關習題

目錄 題型一&#xff08;棧與隊列的基本概念&#xff09;題型二&#xff08;棧與隊列的綜合&#xff09;題型三&#xff08;循環隊列的判空與判滿&#xff09;題型四&#xff08;循環鏈表表示隊列&#xff09;題型五&#xff08;循環隊列的存儲&#xff09;題型六&#xff08;循…

一文揭秘餓了么跨端技術的演進、實踐與落地

跨端技術背景與演進歷程 跨端&#xff0c;究竟跨的是哪些端&#xff1f; 自 90 年的萬維網出現&#xff0c;而后的三十多年&#xff0c;我們依次經歷了 PC 時代、移動時代&#xff0c;以及現在的萬物互聯&#xff08;的 IoT &#xff09;時代&#xff0c;繁榮的背后&#xff…

【Apollo】Apollo-ros版本架構學習與源碼分析

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 這篇文章主要介紹Apollo-ros版本架構學習與源碼分析。 無專精則不能成&#xff0c;無涉獵則不能通。——梁啟超 歡迎來到我的博客&#xff0c;一起學習&#xff0c;共同進步。 喜歡的朋友可以關注一下&a…