C++ STL系列-02.泛型入門

C++ STL系列-02.泛型入門

????????C++中的泛型編程主要通過模板(template)實現。模板允許我們編寫與類型無關的代碼,是一種將類型作為參數進行編程的方式。在C++中,模板分為函數模板和類模板。

1. 函數模板

????????函數模板允許我們定義一個函數,它可以接受多種類型的參數。例如,我們可以寫一個比較兩個值大小的函數模板,而不是為每種類型都寫一個重載函數。

#include<iostream>
template<typename T>
T max(T a, T b) {return a > b ? a : b;
}
int main(int argc, char*argv[]) {int a = 1, b = 5;std::cout << max(a, b) << std::endl;char c = 'a', d = 'h';std::cout << max(c, d) << std::endl;return 0;
}

????????在上面的代碼中,template 告訴編譯器這是一個模板,T 是一個占位符類型。當我們調用 max 函數時,編譯器會根據傳入的參數類型自動生成特定類型的函數。

2. 類模板

????????類模板允許我們定義一個類,其成員的類型可以由模板參數指定。例如,我們可以定義一個簡單的Box類,用來存儲任意類型的值。

#include<iostream>
template<typename T>
class Box {
private:T content;
public:Box(T value) : content(value) {} // 賦值給 contentT getValue() {return content;}
};
//使用類模板時,我們需要在創建對象時指定類型:
int main(int argc, char*argv[]) {Box<int>a = 1;Box<std::string>b("hello");std::cout << a.getValue() << std::endl;std::cout << b.getValue() << std::endl;return 0;
}

3.可變參數模板

????????C++11引入了可變參數模板,允許模板接受可變數量的參數。例如,我們可以定義一個函數,它可以接受任意數量的參數并打印它們:

#include<iostream>
//  基本可變參數模板示例:打印所有參數
// 遞歸終止函數
void print() {std::cout << std::endl;
}// 遞歸展開參數包
template<typename T, typename... Args>
void print(T first, Args... args) {std::cout << first << " ";print(args...);
}
int main(int argc, char*argv[]) {print(1,2,'g',"hello");return 0;
}

C++17引入了折疊表達式,可以更簡潔地展開參數包。

#include<iostream>
template<typename... Args>
void print(Args... args) {(std::cout << ... << args) << std::endl;
}
int main(int argc, char*argv[]) {print(1,2,'g',"hello");return 0;
}

使用折疊表達式求和

#include<iostream>
template<typename... Args>
auto sum(Args... args) {return (args + ...);
}
int main(int argc, char*argv[]) {std::cout << sum(1,2,3,4,5) << std::endl;return 0;
}

使用折疊表達式遍歷加空格

#include<iostream>
template<typename ...Args>
void print(Args... args) {((std::cout << args << ' '), ...) << std::endl;
}
int main(int argc, char*argv[]) {print(1,2,3,4,5);return 0;
}

將參數包存入vector

#include<iostream>
#include<vector>
template<typename T, typename... Args>
std::vector<T> make_vector(Args... args) {return std::vector<T>{static_cast<T>(args)...};
}
int main(int argc, char*argv[]) {auto vec = make_vector<int>(1, 2, 3, 4, 5);std::cout << "Vector: ";for (auto v : vec) {std::cout << v << " ";}return 0;
}

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

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

相關文章

高效管理網絡段和端口集合的工具之ipset

目錄 1. 核心命令速查 2. 集合類型 3. 實戰案例&#xff1a;使用 ipset 封禁 IP 案例 1&#xff1a;基礎黑名單封禁&#xff08;手動添加&#xff09; 案例 2&#xff1a;自動過期和解封 案例 3&#xff1a;封禁 IP 和端口組合 案例 4&#xff1a;白名單模式 案例 5&am…

實例和對象的區別

對象&#xff08;Object&#xff09;是一個概念&#xff0c;它表示“某個類的一個成員”&#xff0c;是“邏輯上的個體”。實例&#xff08;Instance&#xff09;是一個現實&#xff0c;指的是在內存中真正分配了空間的對象。實例一定是對象&#xff0c;但對象不一定是實例。例…

Win10 Chrome認不出新Emoji?兩個擴展搞定顯示與輸入

前言 用Win10電腦在Chrome里發消息、刷網頁時&#xff0c;你是否遇到過這樣的尷尬&#xff1a;別人發的、或者頁面顯示的 Emoji&#xff0c;在你屏幕上變成了空白方框&#xff0c;像“文字里缺了一塊拼圖”&#xff1f;其實這不是Chrome的錯&#xff0c;也不用換電腦&#xff0…

Golang中逃逸現象, 變量“何時棧?何時堆?”

目錄 什么是棧 什么是堆 棧 vs 堆&#xff08;核心區別&#xff09; GO編譯器的逃逸分析 什么是逃逸分析&#xff1f; 怎么看逃逸分析結果&#xff1f; 典型“會逃逸”的場景 閉包捕獲局部變量 返回或保存帶有“底層存儲”的容器 經由接口/反射/fmt 等導致裝箱或被長…

MySQL入門指南:從安裝到工作原理

什么是MySQL MySQL是一個開源的關系型數據庫管理系統&#xff0c;由瑞典MySQL AB公司開發&#xff08;目前屬于Oracle公司&#xff09;&#xff0c;被廣泛地應用在大中小型網站中 MySQL是一個小型的開源的關系型數據庫管理系統&#xff0c;與其他大型數據庫管理系統例如&…

dask.dataframe.shuffle.set_index中獲取 divisions 的步驟分析

dask.dataframe.shuffle.set_index 中獲取 divisions 的步驟分析 主要流程概述 在 set_index 函數中&#xff0c;當 divisionsNone 時&#xff0c;系統需要通過分析數據來動態計算分區邊界。這個過程分為以下幾個關鍵步驟&#xff1a; 1. 初始檢查和準備 if divisions is None:…

ai生成ppt工具有哪些?10款主流AI生成PPT工具盤點

隨著人工智能技術的飛速發展&#xff0c;AI生成PPT工具逐漸成為職場人士、學生和創作者提升效率的得力助手。這類工具通過智能算法&#xff0c;能夠快速將文本、數據或創意轉化為結構化、視覺化的演示文稿&#xff0c;大幅節省設計時間。1、AiPPT星級評分&#xff1a;★★★★★…

Qt多線程編程學習

Qt多線程編程學習 1. 項目概述 本項目展示了Qt中多線程編程的基本用法&#xff0c;通過繼承QThread類創建自定義線程&#xff0c;并演示了線程的啟動、執行和銷毀過程。項目包含一個簡單的用戶界面&#xff0c;用戶可以通過按鈕控制線程的啟動和結束。 1.1 項目結構 項目包含以…

加密貨幣武器化:惡意npm包利用以太坊智能合約實現隱蔽通信

ReversingLabs研究人員發現兩個惡意npm包利用以太坊&#xff08;Ethereum&#xff09;智能合約隱藏并傳播惡意軟件。這兩個名為colortoolsv2和mimelib2的軟件包于2025年7月被識別&#xff0c;展現了開源安全攻防戰中的新戰術。惡意軟件包偽裝成實用工具攻擊活動始于7月7日發布的…

Spring Boot 全局字段處理最佳實踐

在日常開發中&#xff0c;我們總會遇到一些瑣碎但又無處不在的字段處理需求&#xff1a;? 請求處理: 用戶提交的表單&#xff0c;字符串前后帶了多余的空格&#xff0c;需要手動 trim()。? 響應處理: 返回給前端的 BigDecimal 金額&#xff0c;因為精度問題導致JS處理出錯&am…

三坐標測量機在汽車制造行業中的應用

在汽車制造業中&#xff0c;零部件精度決定著整車性能。從發動機活塞的微米級公差&#xff0c;到車身焊接的毫米級間隙&#xff0c;汽車制造“差之毫厘&#xff0c;謬以千里” &#xff0c;任何細微偏差都可能引發連鎖反應&#xff1a;發動機抖動、異響、油耗飆升&#xff0c;車…

機床夾具設計 +選型

機床夾具設計—第2組&#xff08;鉆床夾具&#xff09;仿真組裝視頻_嗶哩嗶哩_bilibili 夾具-商品搜索-怡合達一站式采購平臺 米思米FA標準品電子目錄new 可能要吧這些定位塊單獨用yolo訓練一邊才能搞識別分析 3長條一短銷定位&#xff0c;黃色的用來夾緊 一個面加一短軸一棱…

表格識別技術:通過計算機視覺和OCR,實現非結構化表格向結構化數據的轉換,推動數字化轉型。

在日常工作和生活中&#xff0c;我們無處不在與表格打交道。從財務報表、發票收據&#xff0c;到科研論文中的數據表、醫療報告&#xff0c;表格以其清晰、結構化的方式&#xff0c;承載著大量關鍵信息。然而&#xff0c;當這些表格以紙質或圖片等非結構化形式存在時&#xff0…

Go基礎(②Viper)

Viper 讀取配置創建一個配置文件 config.yamlserver:port: 8080timeout: 30 # 超時時間&#xff08;秒&#xff09; database:host: "localhost"user: "root"password: "123456"name: "mydb"然后用 Viper 讀取這個配置&#xff0c;代…

kafka Partition(分區)詳解

一、什么是 PartitionPartition&#xff08;分區&#xff09; 是 Kafka Topic&#xff08;主題&#xff09; 的最小并行單位。一個 Topic 可以包含多個 Partition&#xff0c;每個 Partition 底層對應一個有序、不可變的消息隊列&#xff0c;消息只會順序追加。Partition 內部消…

中創中間件適配HGDB

文章目錄環境文檔用途詳細信息環境 系統平臺&#xff1a;Microsoft Windows (64-bit) 10 版本&#xff1a;5.6.5 文檔用途 本文章主要介紹中創中間件簡單適配HGDB。 詳細信息 一、數據源配置 1.數據庫準備 &#xff08;1&#xff09;安裝HGDB并創建一個名為myhgdb的數據…

服務器內存和普通計算機內存在技術方面有什么區別?

服務器內存和普通計算機內存在技術上的區別&#xff0c;主要體現在為滿足不同工作場景和要求而采用的設計和特性上。下面這個表格匯總了它們的主要技術差異&#xff0c;方便你快速了解&#xff1a; ?技術特性??服務器內存??普通計算機內存??錯誤校驗 (ECC)??支持ECC(…

哪款AI生成PPT工具對職場新人最友好?操作門檻最低的是哪個?

一句話生成專業PPT&#xff0c;職場新人也能輕松做出高質量演示文稿現代職場節奏快&#xff0c;PPT制作已成為必備技能。然而&#xff0c;職場新人常面臨兩大挑戰&#xff1a;缺乏設計經驗&#xff0c;以及需要在有限時間內完成高質量演示。傳統PPT制作耗時費力&#xff0c;需梳…

1.注解的力量:Spring Boot如何用注解重構IoC容器

文章目錄1.1 IoC容器&#xff1a;Spring的智能管家1.2 注解驅動&#xff1a;給管家下指令1.2.1 SpringBootApplication&#xff1a;總管家的聘書1.2.2 組件注解&#xff1a;員工的身份標識1.2.3 Autowired&#xff1a;依賴注入的三種方式1.2.4 Bean注解&#xff1a;手動招聘特殊…

【算法】92.翻轉鏈表Ⅱ--通俗講解

一、題目是啥?一句話說清 給你一個鏈表和兩個整數 left 和 right,反轉從第 left 個節點到第 right 個節點的子鏈表,并返回反轉后的鏈表。其他部分保持不變。 示例: 輸入:head = [1,2,3,4,5], left = 2, right = 4 輸出:[1,4,3,2,5](反轉了從第2到第4個節點) 二、解題…