首頁  >  文章  >  後端開發  >  「省略號」(...) 表示法在可變參數範本中如何運作以及它在打包和解包參數中的不同作用是什麼?

「省略號」(...) 表示法在可變參數範本中如何運作以及它在打包和解包參數中的不同作用是什麼?

Linda Hamilton
Linda Hamilton原創
2024-10-31 04:26:31546瀏覽

How does the

可變參數模板:揭開省略號的神秘面紗

C 11 中引入的可變參數模板,透過允許函數和類別接受和處理可變數量的參數。然而,它們語法的某些方面可能會引起人們的好奇心。其中一個謎團就是神秘的「省略號」(...) 表示法,它引發了有關其目的和用法的問題。

在可變參數模板的上下文中,省略號 (...) 是一種關鍵工具對於打包解包參數和參數。它的作用由其在模板定義或呼叫中的相對位置決定。

解包:將參數擴展為參數

當放置在表達式右側時,省略號充當解包器。它允許將模板參數擴展為一系列實際參數。例如,在以下函數模板中:

<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(args)... 中的省略號將Args 模板參數解壓縮到args 函數參數列表中,從而可以構造帶有提供的參數的新unique_ptr。

打包:將參數組合成參數

相反,當放置在參數左側時,省略號用作 打包機。它將一系列參數打包到一個參數中。這種打包發生在模板參數推導和函數呼叫呼叫期間。

為了進行說明,請考慮以下函數呼叫:

<code class="cpp">make_unique<int>(1, 2, 3);</code>

make_unique(... ) 打包中的省略號將參數1、2 和3 放入單一參數包中,與Args` 模板參數相符。

範例範本函數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>

呼叫時f 與T 為{int, char, Short},每個函數呼叫擴展為:

<code class="cpp">g(arg0, arg1, arg2);           
h(x(arg0), x(arg1), x(arg2));
m(y(arg0, arg1, arg2));</code>

放置不一致

您可能會注意到放置中明顯的不一致模板參數列表和函數參數列表之間的省略號。在模板參數中,它出現在參數包的中間,而在函數參數中,它出現在末尾。這種差異是因為在模板參數中,省略號是語法糖,代表參數包的解包,而在函數參數中,它是語法的一部分 定義打包參數的類型。

總而言之,可變參數模板中的省略號(...) 在將參數擴展為參數以及將參數組合為參數方面發揮著關鍵作用,從而能夠創建可以處理​​不同數量參數的靈活且可擴展的代碼。

以上是「省略號」(...) 表示法在可變參數範本中如何運作以及它在打包和解包參數中的不同作用是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn