面试题答案
一键面试可变参数模板 print
函数的工作原理
- 模板定义:
template<typename T, typename... Args>
声明了一个模板,其中T
表示第一个参数的类型,Args...
表示零个或多个额外参数的类型包。 - 函数参数:
void print(T first, Args... rest)
函数接受第一个参数first
和剩余参数组成的参数包rest
。 - 递归调用:在函数体中,首先输出
first
,然后递归调用print(rest...)
,不断展开参数包rest
,直到参数包为空。 - 终止条件:当参数包
rest
为空时,调用非模板的print()
函数作为递归终止条件,防止无限递归。
函数调用 print(1, "hello", 3.14);
中编译器的重载匹配过程
- 第一次匹配:编译器首先匹配到模板函数
print(T first, Args... rest)
,将T
推导为int
,Args...
推导为const char*, double
,然后输出1
。 - 递归匹配:接着递归调用
print(rest...)
,此时rest
为("hello", 3.14)
。编译器再次匹配模板函数,将T
推导为const char*
,Args...
推导为double
,输出"hello"
。 - 继续递归匹配:继续递归调用
print(rest...)
,此时rest
为(3.14)
。编译器又一次匹配模板函数,将T
推导为double
,Args...
为空。输出3.14
。 - 终止递归:最后一次递归调用
print(rest...)
,此时Args...
为空,编译器匹配到非模板的print()
函数,递归终止。