'省略號(hào)”(...) 表示法在可變參數(shù)模板中如何工作以及它在打包和解包參數(shù)中的不同作用是什么?
Oct 31, 2024 am 04:26 AM可變參數(shù)模板:揭開(kāi)省略號(hào)的神秘面紗
C 11 中引入的可變參數(shù)模板,通過(guò)允許函數(shù)和類接受和處理可變數(shù)量的參數(shù)。然而,它們語(yǔ)法的某些方面可能會(huì)引起人們的好奇心。其中一個(gè)謎團(tuán)就是神秘的“省略號(hào)”(...) 表示法,它引發(fā)了有關(guān)其目的和用法的問(wèn)題。
在可變參數(shù)模板的上下文中,省略號(hào) (...) 是一種關(guān)鍵工具對(duì)于打包或解包參數(shù)和參數(shù)。它的作用由其在模板定義或調(diào)用中的相對(duì)位置決定。
解包:將參數(shù)擴(kuò)展為參數(shù)
當(dāng)放置在表達(dá)式右側(cè)時(shí),省略號(hào)充當(dāng)解包器。它允許將模板參數(shù)擴(kuò)展為一系列實(shí)際參數(shù)。例如,在以下函數(shù)模板中:
<code class="cpp">template<class T, class... Args> unique_ptr<T> make_unique(Args&&... args) { return unique_ptr<T>(new T(std::forward<Args>(args)...)); }</code>
std::forward
打包:將參數(shù)組合成參數(shù)
相反,當(dāng)放置在參數(shù)左側(cè)時(shí),省略號(hào)充當(dāng)打包器。它將一系列參數(shù)打包到一個(gè)參數(shù)中。這種打包發(fā)生在模板參數(shù)推導(dǎo)和函數(shù)調(diào)用調(diào)用期間。
為了進(jìn)行說(shuō)明,請(qǐng)考慮以下函數(shù)調(diào)用:
<code class="cpp">make_unique<int>(1, 2, 3);</code>
make_unique
示例模板函數(shù) f 演示了打包和解包功能:
<code class="cpp">template <typename ...T> void f(T ...args) { g(args...); // Unpacking: Pattern = args h(x(args)...); // Unpacking: Pattern = x(args) m(y(args...)...); // Packing: Pattern = args (arg to y()) }</code>
當(dāng)使用 T 作為 {int, char, Short} 調(diào)用 f 時(shí),每個(gè)函數(shù)調(diào)用都會(huì)展開(kāi)為:
<code class="cpp">g(arg0, arg1, arg2); h(x(arg0), x(arg1), x(arg2)); m(y(arg0, arg1, arg2));</code>
位置不一致
您可能會(huì)注意到省略號(hào)的位置明顯不一致模板參數(shù)列表和函數(shù)參數(shù)列表之間。在模板參數(shù)中,它出現(xiàn)在參數(shù)包的中間,而在函數(shù)參數(shù)中,它出現(xiàn)在末尾。這種差異是因?yàn)樵谀0鍏?shù)中,省略號(hào)是語(yǔ)法糖,代表參數(shù)包的解包,而在函數(shù)參數(shù)中,它是語(yǔ)法的一部分 定義打包參數(shù)的類型。
總而言之,可變參數(shù)模板中的省略號(hào) (...) 在將參數(shù)擴(kuò)展為參數(shù)以及將參數(shù)組合為參數(shù)方面發(fā)揮著關(guān)鍵作用,從而能夠創(chuàng)建可以處理不同數(shù)量參數(shù)的靈活且可擴(kuò)展的代碼。
以上是'省略號(hào)”(...) 表示法在可變參數(shù)模板中如何工作以及它在打包和解包參數(shù)中的不同作用是什么?的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機(jī)

Video Face Swap
使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)代碼編輯軟件(SublimeText3)

熱門(mén)話題

學(xué)Python的人轉(zhuǎn)學(xué)C 最直接的困惑是:為什么不能像Python那樣寫(xiě)?因?yàn)镃 雖然語(yǔ)法更復(fù)雜,但提供了底層控制能力和性能優(yōu)勢(shì)。1.語(yǔ)法結(jié)構(gòu)上,C 使用花括號(hào){}而非縮進(jìn)組織代碼塊,且變量類型必須顯式聲明;2.類型系統(tǒng)與內(nèi)存管理方面,C 沒(méi)有自動(dòng)垃圾回收機(jī)制,需手動(dòng)管理內(nèi)存并注意釋放資源,使用RAII技術(shù)可輔助資源管理;3.函數(shù)與類定義中,C 需要明確訪問(wèn)修飾符、構(gòu)造函數(shù)和析構(gòu)函數(shù),并支持如運(yùn)算符重載等高級(jí)功能;4.標(biāo)準(zhǔn)庫(kù)方面,STL提供了強(qiáng)大的容器和算法,但需要適應(yīng)泛型編程思想;5

C STL是一組通用模板類和函數(shù),包含容器、算法、迭代器等核心組件。容器如vector、list、map、set用于存儲(chǔ)數(shù)據(jù),vector支持隨機(jī)訪問(wèn),適合頻繁讀取;list插入刪除高效但訪問(wèn)慢;map和set基于紅黑樹(shù),自動(dòng)排序適用于快速查找。算法如sort、find、copy、transform、accumulate封裝常用操作,作用于容器的迭代器范圍。迭代器作為連接容器與算法的橋梁,支持遍歷和訪問(wèn)元素。其他組件包括函數(shù)對(duì)象、適配器、分配器,用于定制邏輯、改變行為及內(nèi)存管理。STL簡(jiǎn)化了C

STL(標(biāo)準(zhǔn)模板庫(kù))是C 標(biāo)準(zhǔn)庫(kù)的重要組成部分,包含容器、迭代器和算法三大核心組件。1.容器如vector、map、set用于存儲(chǔ)數(shù)據(jù);2.迭代器用于訪問(wèn)容器元素;3.算法如sort、find用于操作數(shù)據(jù)。選擇容器時(shí),vector適合動(dòng)態(tài)數(shù)組,list適合頻繁插入刪除,deque支持雙端快速操作,map/unordered_map用于鍵值對(duì)查找,set/unordered_set用于去重。使用算法時(shí)應(yīng)包含頭文件,并配合迭代器和lambda表達(dá)式。注意避免失效迭代器、刪除時(shí)更新迭代器、不可修改m

學(xué)C 沖著打比賽應(yīng)從以下幾點(diǎn)入手:1.熟練基礎(chǔ)語(yǔ)法但不必深入,掌握變量定義、循環(huán)、條件判斷、函數(shù)等基本內(nèi)容;2.重點(diǎn)掌握STL容器如vector、map、set、queue、stack的使用;3.學(xué)會(huì)快速輸入輸出技巧,如關(guān)閉同步流或使用scanf和printf;4.利用模板與宏簡(jiǎn)化代碼書(shū)寫(xiě),提高效率;5.多刷題熟悉邊界條件、初始化錯(cuò)誤等常見(jiàn)細(xì)節(jié)問(wèn)題。

std::chrono在C 中用于處理時(shí)間,包括獲取當(dāng)前時(shí)間、測(cè)量執(zhí)行時(shí)間、操作時(shí)間點(diǎn)與持續(xù)時(shí)間及格式化解析時(shí)間。1.獲取當(dāng)前時(shí)間使用std::chrono::system_clock::now(),可轉(zhuǎn)換為可讀字符串但系統(tǒng)時(shí)鐘可能不單調(diào);2.測(cè)量執(zhí)行時(shí)間應(yīng)使用std::chrono::steady_clock以確保單調(diào)性,并通過(guò)duration_cast轉(zhuǎn)換為毫秒、秒等單位;3.時(shí)間點(diǎn)(time_point)和持續(xù)時(shí)間(duration)可相互操作,但需注意單位兼容性和時(shí)鐘紀(jì)元(epoch)

在C 中,cin和cout用于控制臺(tái)輸入輸出。1.使用cout讀取輸入,注意類型匹配問(wèn)題,遇到空格停止;3.讀取含空格字符串時(shí)用getline(cin,str);4.混合使用cin和getline時(shí)需清理緩沖區(qū)殘留字符;5.輸入錯(cuò)誤時(shí)需調(diào)用cin.clear()和cin.ignore()處理異常狀態(tài)。掌握這些要點(diǎn)可編寫(xiě)穩(wěn)定的控制臺(tái)程序。

作為C 程序員入門(mén)圖形編程,OpenGL是一個(gè)好的選擇。首先需搭建開(kāi)發(fā)環(huán)境,使用GLFW或SDL創(chuàng)建窗口,配合GLEW或glad加載函數(shù)指針,并正確設(shè)置上下文版本如3.3 。其次理解OpenGL的狀態(tài)機(jī)模型,掌握繪制核心流程:創(chuàng)建編譯著色器、鏈接程序、上傳頂點(diǎn)數(shù)據(jù)(VBO)、配置屬性指針(VAO)并調(diào)用繪制函數(shù)。此外要熟悉調(diào)試技巧,檢查著色器編譯與程序鏈接狀態(tài),啟用頂點(diǎn)屬性數(shù)組,設(shè)置清屏顏色等。推薦學(xué)習(xí)資源包括LearnOpenGL、OpenGLRedBook及YouTube教程系列。掌握上述

volatile告訴編譯器變量的值可能隨時(shí)改變,防止編譯器優(yōu)化訪問(wèn)。1.用于硬件寄存器、信號(hào)處理程序或線程間共享變量(但現(xiàn)代C 推薦std::atomic)。2.每次訪問(wèn)都直接讀寫(xiě)內(nèi)存而非緩存到寄存器。3.不提供原子性或線程安全,僅確保編譯器不優(yōu)化讀寫(xiě)。4.與const相反,有時(shí)兩者結(jié)合使用表示只讀但可外部修改的變量。5.不能替代互斥鎖或原子操作,過(guò)度使用會(huì)影響性能。
