省略號和可變參數模板

本文主要介紹如何展開可變參數的參數包

1.C語言的va_list展開可變參數
#include <iostream>
#include <cstdarg>void printNumbers(int count, ...) {// 聲明va_list類型的變量va_list args;// 使用va_start將可變參數寫入變量argsva_start(args, count);for (int i = 0; i < count; i++) {// 調用va_arg依次獲取可變參數的參數值int value = va_arg(args, int);std::cout << value << " ";}// 使用va_end清理變量argsva_end(args);std::cout << std::endl;
}int main() {printNumbers(3, 1, 2, 3); // 輸出: 1 2 3printNumbers(5, 1, 2, 3, 4, 5); // 輸出: 1 2 3 4 5
}

? ? ? ?使用va_list感覺還挺麻煩的,需要提前知道參數個數,并且還得需要知道入參類型。因此不如直接使用數組了。

2.C++的initializer_list展開可變參數
#include <iostream>template <typename T>
void printNumbers(std::initializer_list<T> nums) {// 獲取可變參數長度為std::cout << "可變參數長度為:" << nums.size() << std::endl;std::cout << std::endl;// 遍歷輸出可變參數,方法1for (const T& i: nums) {std::cout << i << " ";}std::cout << std::endl;
}int main() {printNumbers({"1","qq"});printNumbers({1, 2, 3});
}
3.可變參數模板--遞歸函數方式展開可變參數
#include <iostream>using namespace std;void print() {cout << endl;
}template <typename T> 
void print(const T& t) {cout << t << endl;
}template <typename First, typename... Rest> 
void print(const First& first, const Rest&... rest) {cout << first << ", ";print(rest...); // recursive call using pack expansion syntax
}int main()
{print(); // calls first overload, outputting only a newlineprint(1); // calls second overload// these call the third overload, the variadic template,// which uses recursion as needed.print(10, 20);print(100, 200, 300);print("first", 2, "third", 3.14159);
}

? ? ? ?使用這種方法,可變參數可以是任意類型的,不需要都統一是一個類型了。

? ? ? ?這種方法需要提供一個參數包展開的函數和一個遞歸終止函數,二者同名。遞歸終止函數的參數可以為0,1,2或者多個(一般用到0個或1個),當參數包中剩余的參數個數等于遞歸終止函數的參數個數時,就調用遞歸終止函數,則函數終止。

4.可變參數模板--折疊表達式展開可變參數
#include <iostream>template<typename... Args>
void prints(Args... args) {//注意args在前,省略號在后否則報錯//std::cout <<sizeof...(args)<<std::endl;//sizeof...() 運算符可獲取參數包參數個數((std::cout << args << " "), ...); // 折疊表達式展開參數包std::cout << std::endl;
}int main() {prints("test", 2, 'k');   // 輸出: test 2 kprints(1, 2, 3, 4, 5);   // 輸出: 1 2 3 4 5
}

? ? ? ?折疊表達式是C++17 才引入的新特性,使用折疊表達式可以很方便實現展開可變參數,但是可讀性也會大打折扣。在此使用的是折疊表達式的逗號運算符。折疊表達式還會分為左折疊和右折疊。

5.可變參數模板--結合std::tuple展開可變參數
#include <iostream>
#include <tuple>// 終止條件:當索引等于元組大小時
template<size_t I = 0, typename Tuple>
typename std::enable_if<I == std::tuple_size<Tuple>::value, void>::type
printtp(const Tuple&) {// 空實現,遞歸終止
}// 遞歸展開:當索引小于元組大小時
template<size_t I = 0, typename Tuple>
typename std::enable_if<I < std::tuple_size<Tuple>::value, void>::type
printtp(const Tuple& t) {std::cout << std::get<I>(t) << std::endl;  // 打印當前元素printtp<I + 1>(t);                         // 遞歸調用下一個索引
}// 包裝函數:將參數包轉換為元組并調用printtp
template<typename... Args>
void print(Args... args) {printtp(std::make_tuple(args...));
}int main() {print(1, "hello", 3.14);  // 輸出:1\nhello\n3.14return 0;
}

? ? ? ?在這使用了std::tuple數據結構以及類型萃取中常用的std::enable_if。其實本質上還是遞歸模板參數展開,用起來可能不如直接使用上述方法三。

本文參考:

https://zhuanlan.zhihu.com/p/684295744

C++17常用新特性(十一)---折疊表達式-騰訊云開發者社區-騰訊云

省略號和可變參數模板 | Microsoft Learn

https://zhuanlan.zhihu.com/p/731232067

C++中神奇的tuple:詳解使用技巧和實例解析-騰訊云開發者社區-騰訊云

C++之std::enable_if_std enable if-CSDN博客

c++11——可變參數模板 - 農民伯伯-Coding - 博客園

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

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

相關文章

三十五、面向對象底層邏輯-Spring MVC中AbstractXlsxStreamingView的設計

在Web應用開發中&#xff0c;大數據量的Excel導出功能是常見需求。傳統Apache POI的XSSF實現方式在處理超大數據集時&#xff0c;會因全量加載到內存導致OOM&#xff08;內存溢出&#xff09;問題。Spring MVC提供的AbstractXlsxStreamingView通過流式處理機制&#xff0c;有效…

【大模型:知識圖譜】--3.py2neo連接圖數據庫neo4j

【圖數據庫】--Neo4j 安裝_neo4j安裝-CSDN博客 需要打開圖數據庫Neo4j&#xff0c; neo4j console 目錄 1.圖數據庫--連接 2.圖數據庫--操作 2.1.創建節點 2.2.刪除節點 2.3.增改屬性 2.4.建立關系 2.5.查詢節點 2.6.查詢關系 3.圖數據庫--實例 1.圖數據庫--連接 fr…

基于dify的營養分析工作流:3分鐘生成個人營養分析報告

你去醫院做體檢&#xff0c;需要多久拿到體檢報告呢&#xff1f;醫院會為每位病人做一份多維度的健康報告嗎&#xff1f;"人工報告需1小時/份&#xff1f;數據誤差率高達35%&#xff1f;傳統工具無法個性化&#xff1f; Dify工作流AI模型的組合拳&#xff0c;正在重塑健康…

Web后端基礎(基礎知識)

BS架構&#xff1a;Browser/Server&#xff0c;瀏覽器/服務器架構模式。客戶端只需要瀏覽器&#xff0c;應用程序的邏輯和數據都存儲在服務端。 優點&#xff1a;維護方便缺點&#xff1a;體驗一般 CS架構&#xff1a;Client/Server&#xff0c;客戶端/服務器架構模式。需要單獨…

MySQL(56)什么是復合索引?

復合索引&#xff08;Composite Index&#xff09;&#xff0c;也稱為多列索引&#xff0c;是在數據庫表的多列上創建的索引。它可以提高涉及多個列的查詢性能&#xff0c;通過組合多個列的值來索引數據。復合索引特別適用于需要同時過濾多列的查詢。 復合索引的優點 提高多列…

高并發下的緩存擊穿/雪崩解決方案

有效解決緩存擊穿和雪崩的方法包括&#xff1a;1. 使用互斥鎖處理緩存擊穿&#xff1b;2. 采用熔斷器模式防止雪崩&#xff1b;3. 實施緩存預熱和降級策略&#xff1b;4. 利用分片和多級緩存分散請求壓力。這些方法各有優劣&#xff0c;需根據實際業務場景靈活調整和結合使用。…

【讀論文】OpenAI o3與o4系統模型技術報告解讀

回顧一下,4月16日,OpenAI發布了一份關于其o系列新模型——OpenAI o3和OpenAI o4-mini——的System Card。這份文檔不僅揭示了這兩款模型在推理能力和工具使用方面的顯著進步,也詳細闡述了其訓練方法、數據來源、安全評估以及在圖像理解生成、數學推理等多個核心領域的表現。…

第1課、LangChain 介紹

LangChain 介紹 LangChain 是一個以大語言模型&#xff08;LLM, Large Language Model&#xff09;為核心的開發框架&#xff0c;旨在幫助開發者高效地將如 GPT-4 等大型語言模型與外部數據源和計算資源集成&#xff0c;構建智能化應用。 1.1 工作原理 如上圖所示&#xff…

【論文閱讀28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆開、篩優質因子&#xff0c;再用 CNN-BiLSTM-Attention 來動態預測每個子序列&#xff0c;最后重構出總位移&#xff0c;預測效果超越傳統模型。 文章目錄 1 引言2 方法2.1 位移時間序列加性模型2.2 變分模態分解 (VMD) 具體步驟2.3.1 樣本熵&#xff08;S…

[論文閱讀] 人工智能+軟件工程(軟件測試) | 當大語言模型遇上APP測試:SCENGEN如何讓手機應用更靠譜

當大語言模型遇上APP測試&#xff1a;SCENGEN如何讓手機應用更靠譜&#xff1f; 一、論文基礎信息 論文標題&#xff1a;LLM-Guided Scenario-based GUI Testing&#xff08;《大語言模型引導的基于場景的GUI測試》&#xff09;作者及機構&#xff1a;Shengcheng Yu等&#x…

香橙派3B學習筆記7:snap安裝管理軟件包_打包程序與依賴

有時可以嘗試把程文件與其依賴一塊打包安裝&#xff0c;這里就學習一下。 ssh &#xff1a; orangepi本地ip 密碼 &#xff1a; orangepi 操作系統發行版&#xff1a; 基于 Ubuntu 20.04.6 LTS&#xff08;Focal Fossa&#xff09;的定制版本&#xff0c;專門為 Orange Pi 設備…

Playwright 測試框架 - .NET

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】

Model Context Protocol (MCP) 是一個前沿框架

微軟發布了 Model Context Protocol (MCP) 課程&#xff1a;mcp-for-beginners。 Model Context Protocol (MCP) 是一個前沿框架&#xff0c;涵蓋 C#、Java、JavaScript、TypeScript 和 Python 等主流編程語言&#xff0c;規范 AI 模型與客戶端應用之間的交互。 MCP 課程結構 …

【量化】策略交易 - 均線策略(Moving Average Strategy)- 代碼增強版本

策略交易 - 均線策略&#xff08;Moving Average Strategy&#xff09;- 代碼增強版本 一、前言 本文主要是針對 【量化】策略交易 - 均線策略&#xff08;Moving Average Strategy&#xff09; 中的代碼事例&#xff0c;進行邏輯的增強&#xff0c;添加了模擬買入和賣出邏輯&…

為什么要引入內聯函數?

C 中引入內聯函數主要有以下幾個目的&#xff1a; 提高程序運行效率 - 普通函數調用會有一定的開銷&#xff0c;如保存現場、傳遞參數、跳轉到函數地址執行等。內聯函數在編譯時&#xff0c;會將函數體直接插入到調用處&#xff0c;避免了函數調用的開銷&#xff0c;從而提高程…

C++.OpenGL (17/64)模型(Model)

模型(Model) 模型系統架構 #mermaid-svg-Zaji5BPdvnIkXIVg {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Zaji5BPdvnIkXIVg .error-icon{fill:#552222;}#mermaid-svg-Zaji5BPdvnIkXIVg .error-text{fill:#55222…

【Java學習筆記】System類

System 類 常用方法 方法描述System.exit()退出當前程序System.arraycopy(源數組&#xff0c;源數組起始索引&#xff0c;目標數組&#xff0c;目標數組起始索引&#xff0c;拷貝長度)復制數組元素&#xff0c;比較適合底層調用System.currentTimeMillis()返回當前時間距離 1…

因泰立科技H1X激光雷達:因泰立科技為智慧工業注入新動力

在當今工業領域&#xff0c;精準測量與高效作業是推動產業升級的關鍵因素。因泰立科技推出的H1X三維輪廓掃描激光雷達&#xff0c;憑借其卓越的性能和廣泛的應用場景&#xff0c;正成為智慧工業中不可或缺的高科技裝備。 產品簡介 H1X三維輪廓掃描激光雷達是因泰立科技基于二維…

【threejs】每天一個小案例講解:創建基本的3D場景

代碼倉 GitHub - TiffanyHoo/three_practices: Learning three.js together! 可自行clone&#xff0c;無需安裝依賴&#xff0c;直接liver-server運行/直接打開chapter01中的html文件 運行效果圖 知識要點 核心運行代碼 <!DOCTYPE html><html><head><t…

微軟PowerBI考試 PL300-使用 Power BI 準備數據以供分析【提供練習數據】

微軟PowerBI考試 PL300-使用 Power BI 準備數據以供分析 您將了解如何使用 Power Query 從不同的數據源中提取數據&#xff0c;選擇存儲模式和連接性類型。 您還將了解在對數據進行建模之前&#xff0c;如何分析、清理數據以及將數據加載到 Power BI 中。 在 Power BI 中獲取…