首页 > 解决方案 > 模板如何避免无限递归?

问题描述

我目前正在学习有关 SDL2 的本教程,并且遇到了模板,这对我来说是全新的。

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()函数中调用不只是创建一个无限的递归循环,而是调用下面的专用模板函数之一。此外,我无法理解 call forward()fora但不是 for b,就我收集的内容而言,在使用左值和右值forward()调用时应该解决任何问题cleanup()

标签: c++templatesrecursionvariadic-templatesrvalue

解决方案


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

如果您将nvars 传递给此函数,则第一个将转到正文中的第一个函数(结束。请注意,没有内部调用)。

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

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

因此,这不是无穷无尽的功能。


推荐阅读