[英]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。
Function 調用並不是解包所必需的,請參閱cppreference 上的擴展部分。
直接訪問是不可能的,因為這意味着參數包不是可變參數。 但是,您始終可以編寫您的 function 版本,直接引用任何索引的模板,只需提供一個模板整數並在遞減 integer 時擴展參數包(並在其為 0 時定義特殊行為)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.