在可变参数模板中使用sizeof运算符可跳过函数以结束递归

哈里安·辛格(Hariom Singh)

我试图使用运算符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()
{

}

问题是如何避免递归函数结束

丹尼尔·H

在C ++ 17之前的版本中,如果没有一些解决方法就无法做到这一点,除非您重写该函数以使其不递归。原因是整个函数体被替换,包括if永远不会发生语句分支这意味着Display()即使在运行时从未发生过,编译器也不会看到对参数的调用

从C ++ 17开始,解决方案是使用if constexpr而不是just if这告诉编译器在编译时评估条件,而不尝试编译未执行的分支。

注意,上面的“不尝试编译”是一种简化。该链接提供了有关确切完成和未完成操作的更多详细信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

可变参数模板继承中的运算符重载

可变参数模板参数转发使用逗号运算符

使用用户定义的转换运算符进行函数模板参数推导

为什么通过通用引用运算符 (&&) 将变量的引用传递给可变参数模板函数失败?

递归可变参数函数模板

在函数参数中使用<<运算符

在可变参数模板中使用对

sizeof运算符结合可变长度数组作为函数参数

带有逗号运算符和可变参数模板参数包的折叠表达式

递归可变参数函数模板的返回类型的decltype

递归可变参数模板函数-不明确吗?

如何编写可变参数模板的递归函数?

N维向量的递归可变参数模板函数

可变参数模板递归构造函数问题

将递归可变参数模板函数转换为迭代

具有递归继承并使用声明的可变参数模板

在操作符重载中使用可变参数模板合法吗?

在C ++中使用可变参数模板迭代参数包

使用可变参数模板构建函数参数

c ++ 11递归可变参数模板

可变参数模板循环,非递归

可变参数模板的递归继承

递归可变参数模板如何工作?

在VS2013中使用可变参数模板时“对重载函数的歧义调用”

如何在可变参数模板函数中使用source_location?

是否可以在可变参数函数模板中使用“ enable_if”和“ is_same”?

使用可变参数类模板的模板参数调用可变参数函数模板?

使用成员函数调用可变参数模板函数

可变参数模板-递归函数-最后一个可变参数成员