Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 递归变量模板是如何工作的?_C++_Templates_C++17_Variadic Templates - Fatal编程技术网

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...);
}