C++ 递归变量模板是如何工作的?
使用此代码:C++ 递归变量模板是如何工作的?,c++,templates,c++17,variadic-templates,C++,Templates,C++17,Variadic Templates,使用此代码: 静态无符号计数=0; 模板 自动求和(T…args) { ++计数; 返回(…+args); } 内部主(空) { 标准::cout sum模板函数调用一次吗 是的,它不会被递归调用。相反,表达式被扩展为 折叠表达式的实例化将表达式e展开为 如下: … 2) 一元左折(…op E)变成((E1 op E2)op…)op EN) (其中N是组件扩展中的元素数) 您可能希望将++count放入折叠表达式中,例如 template<typename... T> auto s
静态无符号计数=0;
模板
自动求和(T…args)
{
++计数;
返回(…+args);
}
内部主(空)
{
标准::cout
sum
模板函数调用一次吗
是的,它不会被递归调用。相反,表达式被扩展为
折叠表达式的实例化将表达式e展开为
如下:
…
2) 一元左折(…op E)变成((E1 op
E2)op…)op EN)
(其中N是组件扩展中的元素数)
您可能希望将++count
放入折叠表达式中,例如
template<typename... T>
auto sum(T... args)
{
return (... + (++count, args));
}
模板
自动求和(T…args)
{
返回(…+(++count,args));
}
如前所述,它的值与包扩展中的元素数相同,sizeof…
也可以采用该值。如果要多次调用sum
,可以递归执行:
static unsigned count = 0;
template <typename T>
auto sum(T t)
{
++count;
return t;
}
template <typename T, typename... Ts>
auto sum(T t, Ts... ts)
{
++count;
return t + sum(ts...);
}
静态无符号计数=0;
模板
自动求和(T)
{
++计数;
返回t;
}
模板
自动求和(T,Ts…Ts)
{
++计数;
返回t+和(ts…);
}
是的,您只对函数进行了一次调用;在计算函数调用的数量时,参数的数量无关紧要。求和函数必须自己调用才能递归-它不是。您能详细说明一下您期望它是8的逻辑吗?显然,期望它是1。表达式被转换为一个序列加法语句,而不是递归语句calls@GhasemRamezani为什么?sum的主体不调用sum。如果目标是计算模板包中的参数数量,我更愿意使用sizeof…(T)
,如我编写时所示(++count,args)
,编译器(GCC9)给我一个警告:对“count”的多个未排序的修改。@GhasemRamezani是的,多个++count
的求值顺序在这里将是未排序的;我认为在这种情况下没有问题。不,我对C++模板
是新手,我的目标是知道我们何时在函数体中使用..
来使用剩余参数,是否为递归函数调用。
static unsigned count = 0;
template <typename T>
auto sum(T t)
{
++count;
return t;
}
template <typename T, typename... Ts>
auto sum(T t, Ts... ts)
{
++count;
return t + sum(ts...);
}