模板如何避免无限递归?

时间:2020-07-20 23:55:08

标签: c++ templates recursion variadic-templates rvalue

我目前正在关注SDL2上的this tutorial,并且遇到了模板,这对我来说是全新的。

template<typename T, typename... Args>
void cleanup(T *t, Args&&... args){
    cleanup(t);
    cleanup(std::forward<Args>(args)...);
}

template<> inline void cleanup<SDL_Window>(SDL_Window *window){
    ...
}
...

我不明白如何在cleanup()函数中调用cleanup()不仅会创建无穷的递归循环,还会调用下面的专用模板函数之一。另外,对于forward()调用a来说没有太大意义,但对于b而言,我没有多大意义,至于我收集到的信息,forward()应该可以解决所有问题cleanup()带有左值和右值。

1 个答案:

答案 0 :(得分:2)

cleanup(T *a, Vars&&... b)

如果您将n vars传递给此函数,则第一个函数将到达主体中的第一个函数(结束)。请注意,没有内部调用。

其余的n-1将转到正文中的第二个函数,这将再次调用一个函数,但要使用n-1 vars。

此过程将一直持续到只有两个参数,然后第一次和第二次调用都将使用第二个函数,因为这将是最佳匹配。

因此,这不是无止境的功能。