模板如何避免无限递归?

How do templates avoid infinite recursion?

我目前在 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() 不仅会创建一个无限的递归循环,还会调用下面的一个专用模板函数。另外,我对 a 而不是 b 调用 forward() 没有多大意义,至于我收集到的信息, forward() 应该在调用时解决任何问题cleanup() 具有左值和右值。

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

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

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

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

因此这不是无穷无尽的函数。