我试图使用运算符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
而不是just if
。这告诉编译器在编译时评估条件,而不尝试编译未执行的分支。
注意,上面的“不尝试编译”是一种简化。该链接提供了有关确切完成和未完成操作的更多详细信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句