MST

星途 面试题库

面试题:C++可变参数模板之函数重载匹配

假设有如下C++代码: ```cpp #include <iostream> void print() {} template<typename T, typename... Args> void print(T first, Args... rest) { std::cout << first << " "; print(rest...); } int main() { print(1, "hello", 3.14); return 0; } ``` 请解释这段代码中可变参数模板`print`函数的工作原理,以及在函数调用`print(1, "hello", 3.14);`过程中,编译器是如何进行函数重载匹配的。
10.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

可变参数模板 print 函数的工作原理

  1. 模板定义template<typename T, typename... Args> 声明了一个模板,其中 T 表示第一个参数的类型,Args... 表示零个或多个额外参数的类型包。
  2. 函数参数void print(T first, Args... rest) 函数接受第一个参数 first 和剩余参数组成的参数包 rest
  3. 递归调用:在函数体中,首先输出 first,然后递归调用 print(rest...),不断展开参数包 rest,直到参数包为空。
  4. 终止条件:当参数包 rest 为空时,调用非模板的 print() 函数作为递归终止条件,防止无限递归。

函数调用 print(1, "hello", 3.14); 中编译器的重载匹配过程

  1. 第一次匹配:编译器首先匹配到模板函数 print(T first, Args... rest),将 T 推导为 intArgs... 推导为 const char*, double,然后输出 1
  2. 递归匹配:接着递归调用 print(rest...),此时 rest("hello", 3.14)。编译器再次匹配模板函数,将 T 推导为 const char*Args... 推导为 double,输出 "hello"
  3. 继续递归匹配:继续递归调用 print(rest...),此时 rest(3.14)。编译器又一次匹配模板函数,将 T 推导为 doubleArgs... 为空。输出 3.14
  4. 终止递归:最后一次递归调用 print(rest...),此时 Args... 为空,编译器匹配到非模板的 print() 函数,递归终止。