看下面的例子,
void printEx(){}
template <typename T, typename... Types>
void printEx(const T& firstArg, const Types... args) {
std::cout << firstArg << std::endl;
printEx(args...);
}
void testFun {
printEx(1, "abc", 100, 1.5f, 'c', new char [5]);
}
我们查看下它编译后的情况如下:
可以看到,这个模板函数生成了各个版本的调用,这个就是模板的实质,当编译的时候会根据源码的具体实现情况,生成实际的函数调用代码。
在本例中,我们的模板是不固定参数的,其依赖于printEx(1, "abc", 100, 1.5f, 'c', new char [5]);
而该函数必须实现下面的版本:
printEx(int, const char*, int, float, char, char*), 在这个实现内部会继续调用
printEx(const char*, int, float, char, char*), 每次递归减少一个参数
最终以printEx() 结束