面试题答案
一键面试函数模板实例化基本过程
- 隐式实例化:当编译器遇到一个函数模板调用,且模板参数未显式指定时,编译器会根据调用的实参类型来推导模板参数类型,进而生成一个具体的函数实例。例如有函数模板
template <typename T> T add(T a, T b) { return a + b; }
,当调用add(3, 5);
时,编译器根据实参3
和5
的类型int
,推导出T
为int
,从而生成int add(int a, int b)
这样一个具体函数实例。 - 显式实例化:程序员通过明确指定模板参数类型,让编译器生成特定类型的函数实例。语法为
template return_type function_name<template_arguments>(argument_list);
。比如对于上述add
函数模板,显式实例化template int add<int>(int a, int b);
,这样即使没有对add
函数以int
类型参数进行调用,也会生成int add(int a, int b)
这个函数实例。
两者区别举例
#include <iostream>
// 函数模板定义
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
// 隐式实例化
int result1 = add(2, 3); // 编译器根据实参推导T为int,隐式实例化int add(int, int)
std::cout << "隐式实例化结果: " << result1 << std::endl;
// 显式实例化
template float add<float>(float a, float b);
float result2 = add<float>(2.5f, 3.5f);
std::cout << "显式实例化结果: " << result2 << std::endl;
return 0;
}
在这个例子中,隐式实例化是根据调用时的实参类型 int
让编译器自动推导并生成 int add(int, int)
;而显式实例化是通过 template float add<float>(float a, float b);
提前指定生成 float add(float, float)
函数实例,即便没有直接根据 float
类型实参的调用,该实例也会生成。