簡體   English   中英

C++ 中的可變參數模板及其工作原理

[英]Variadic templates in C++ and how they work

所以我試圖了解可變參數模板是如何工作的,所以我有這個代碼:

template <typename Res, typename Type>
void Sum(Res &result, Type &val)
{
    result += val;
}

template <typename Res, typename First, typename... Rest>
void Sum(Res &result, First val1, Rest... valN)
{
    result += val1;
    return Sum(result, valN...);
}

現在我的書說:

編譯器實際上為適合調用的正確類型的Sum()創建代碼,遞歸地執行此操作,直到所有 arguments 都已處理。

現在我不明白這一點,我也嘗試調試,我看到第二個 Sum function 塊被每個 valN 值調用,然后在最后一個調用第一個Sum() function,這對我沒有任何意義。

我還了解到,要解壓它們,我們需要在可變參數模板 function 中使用 function 調用,這是真的嗎?

為什么我們必須解壓它們,我不明白,我們不能直接在可變參數模板 function 中訪問它們嗎?

提前致謝。

我認為您可能會錯過這一點,即當您在調試器中逐步執行此操作時,您每次都會輸入一個完全不同的 function。
(請注意,“下一個”調用中不使用val1 ,因此您每次都少傳遞一個參數。)

如果沒有可變參數模板,您需要將它們拼寫為單獨的模板,但它是完全相同的:

template <typename Res, typename T>
void Sum(Res& result, T val)
{
    result += val;
}

template <typename Res, typename T1, typename T2>
void Sum(Res& result, T1 val1, T2 val2)
{
    result += val1;
    Sum(result, val2);
}

template <typename Res, typename T1, typename T2, typename T3>    
void Sum(Res& result, T1 val1, T2 val2, T3 val3)
{
    result += val1;
    Sum(result, val2, val3);
}

template <typename Res, typename T1, typename T2, typename T3, typename T4>        
void Sum(Res& result, T1 val1, T2 val2, T3 val3, T4 val4)
{
    result += val1;
    Sum(result, val2, val3, val4);
}

template <typename Res, typename T1, typename T2, typename T3, typename T5>    
void Sum(Res& result, T1 val1, T2 val2, T3 val3, T4 val4, T5 val5)
{
    ...

等等,你需要多少就多少。

可變參數模板使編譯器“按需”生成所有這些,並避免您將它們全部寫出來。

一種看待它的方法是,常規的 function 模板(只有類型參數)生成具有相同數量參數的重載; 可變參數模板還允許您生成具有不同數量參數的重載。

直接訪問是不可能的,因為您不知道參數包中有多少元素,它們的類型是什么,並且它們沒有名稱。
如果你想訪問一個特定的參數,你還需要讓它顯式。

試想一下,模板的工作方式就像每次匹配其中一個模板規范時都會創建一個 function。

  • 如果您有 4 個 arguments,編譯器會看到與參數包定義匹配,即對 3 個參數版本的調用。
  • 然后也需要生成該版本,但這再次調用 2 參數版本。
  • 那個不符合第二個定義,而是第一個,完全可以解決。

Function 調用並不是解包所必需的,請參閱cppreference 上的擴展部分

直接訪問是不可能的,因為這意味着參數包不是可變參數。 但是,您始終可以編寫您的 function 版本,直接引用任何索引的模板,只需提供一個模板整數並在遞減 integer 時擴展參數包(並在其為 0 時定義特殊行為)。

[在可變參數模板的第五個處理參數上打印部分和的示例]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM