c++ - 模板如何避免无限递归?
问题描述
我目前正在学习有关 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()
。
解决方案
cleanup(T *a, Vars&&... b)
如果您将n
vars 传递给此函数,则第一个将转到正文中的第一个函数(结束。请注意,没有内部调用)。
其余的n-1
将转到正文中的第二个函数,这将再次调用一个函数,但使用n-1
vars。
这个过程将一直持续到只有两个参数,然后第一次和第二次调用都将使用第二个函数,因为它是最佳匹配。
因此,这不是无穷无尽的功能。
推荐阅读
- python - 如果添加到事件处理程序中,Tk 窗口中的图像不会显示
- git - 在 GitLab 中显示现有的 git 存储库?
- android - 无法将 LiveData 列表绑定到 Spinner 条目
- algorithm - 记录器速率限制器
- laravel - 在foreach之后放置链接时Laravel Pgination不起作用
- python - 如何在单独的运行进程中修改类变量?
- android - android.app.ActivityThread.performLaunchActivity 的 java.lang.RuntimeException
- c# - 在 Visual Studio 中使用自动代码完成时,有没有办法修改 IntelliSense 输入的代码?
- gradle - build.gradle 中“实施”的优势
- javascript - Chart.js 每个堆叠条一个标签