有时候模板参数可以把几个类型的列表看成单一的模板实参,并用这一单一的实参进行传递。 有两个作用:
#include <iostream>
void tprintf(const char* format) // base function
{
std::cout << format;
}
template<typename T, typename... Targs> //typename不可省略
void tprintf(const char* format, T value, Targs... Fargs) // recursive variadic function
{
//std::cout << "|format:" << format << "...|value:" << value << "|size of Fargs:" << sizeof...(Fargs) << std::endl;
for ( ; *format != '\0'; format++ ) {
if ( *format == '%' ) {
std::cout << value;
//std::cout << std::endl;
tprintf(format+1, Fargs...); // recursive call, value不再作为参数传递, 自动取Fargs的第一个参数给形参value
return;
}
std::cout << *format;
}
}
int main()
{
tprintf("% world% %! fuck,%!\n","Hello",'!',123,"get it");//把%看做%s、%d就好理解了
return 0;
}
//Hello world! 123! fuck,get it!