【发布时间】:2020-11-10 07:06:49
【问题描述】:
我目前在 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 调用forward() 而为b 调用没有多大意义,就我所收集到的而言,forward() 应该可以解决在使用左值和右值调用cleanup() 时出现的任何问题.
【问题讨论】:
-
好吧,
cleanup(T *t, Args&&... args)的参数与cleanup<SDL_Window>(SDL_Window *window)不同,前者采用T类型的参数和typename... Args的可变数量的参数。请注意,typename... Args仍然需要至少一个参数,因此您的模板清理函数和已解析的显式函数之间没有歧义。 -
模板类型在编译时被转换为特定的函数/类。对于可变参数模板,编写“递归”是常见的做法。你可以阅读this tutorial 的第一部分来弄清楚为什么它在技术上不是递归
-
@h0r53:
typename... Args不需要至少一个参数,它可以匹配零。但由于重载规则,这是一个比其他任何事情都更糟糕的匹配。
标签: c++ templates recursion variadic-templates rvalue