簡體   English   中英

在可變參數模板中使用sizeof運算符可在遞歸結束時跳過該函數

[英]Use of sizeof operator in Variadic Template to skip the function for the end of recursion

我正在嘗試使用運算符sizeof...如果沒有參數,則不通過調用來跳過遞歸函數

#include<iostream>

template<typename T, typename ...Types>
void Display(T firstArg, Types...Args)
{  
    std::cout << firstArg << "\n";
    std::cout << sizeof...(Types) << "\n";
    std::cout << sizeof...(Args) << "\n";
    if (sizeof...(Args) > 0)
    Display(Args...);
}

int main()
{
    Display(1, 2, 3,"hello");
    return 0;
}

但是我在Display(Args...);

錯誤C2780:'無效顯示(T,Types ...)':需要2個參數-提供0

解決方法是在遞歸結束時添加功能(我想避免)

void Display()
{

}

問題是如何避免遞歸函數結束

在C ++ 17之前的版本中,如果沒有一些解決方法就無法做到這一點,除非您重寫該函數以使其不遞歸。 原因是整個函數體被替換,包括if語句的分支,這些分支永遠不會發生。 這意味着即使在運行時從未發生過,編譯器也可以看到不帶參數的Display()調用。

從C ++ 17開始,解決此問題的方法是使用if constexpr而不是if 這告訴編譯器在編譯時評估條件,而不嘗試編譯未執行的分支。

注意上面的“不嘗試編譯”只是一種簡化; 該鏈接提供了有關確切完成和未完成操作的更多詳細信息。

暫無
暫無

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

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