模板如何避免无限递归?
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
变量。
这个过程会一直持续到只有两个参数,然后第一次和第二次调用都会使用第二个函数,因为它是最匹配的。
因此这不是无穷无尽的函数。
我目前在 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
变量。
这个过程会一直持续到只有两个参数,然后第一次和第二次调用都会使用第二个函数,因为它是最匹配的。
因此这不是无穷无尽的函数。