MST

星途 面试题库

面试题:C++函数模板实例化中的重载与特化

假设存在一个函数模板 `template <typename T> void func(T param);`,请说明当有函数模板重载 `template <typename T> void func(T param, int num);` 以及针对特定类型(如 `int`)的特化 `template <> void func<int>(int param);` 时,实例化过程中编译器如何选择合适的版本,结合具体代码示例进行分析。
28.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 编译器选择规则

    • 首先,编译器会优先寻找完全匹配的特化版本。如果存在针对特定类型的特化模板,并且参数列表完全匹配,那么编译器将选择该特化版本。
    • 如果没有找到完全匹配的特化版本,编译器会在普通函数模板中寻找最匹配的版本。匹配程度根据函数参数的精确程度来判断,比如参数个数、类型转换等。
  2. 代码示例

#include <iostream>

// 普通函数模板
template <typename T>
void func(T param) {
    std::cout << "普通函数模板:func(T param), param = " << param << std::endl;
}

// 重载的普通函数模板
template <typename T>
void func(T param, int num) {
    std::cout << "重载的普通函数模板:func(T param, int num), param = " << param << ", num = " << num << std::endl;
}

// 针对int类型的特化
template <>
void func<int>(int param) {
    std::cout << "针对int类型的特化:func<int>(int param), param = " << param << std::endl;
}

int main() {
    int a = 10;
    double b = 20.5;

    func(a); // 优先匹配针对int类型的特化版本
    func(b); // 匹配普通函数模板func(T param)
    func(a, 5); // 匹配重载的普通函数模板func(T param, int num)

    return 0;
}

在上述代码中:

  • 当调用 func(a) 时,因为存在针对 int 类型的特化 template <> void func<int>(int param);,所以编译器优先选择这个特化版本。
  • 当调用 func(b) 时,由于没有针对 double 类型的特化,编译器会选择普通函数模板 template <typename T> void func(T param);
  • 当调用 func(a, 5) 时,没有完全匹配的特化版本,但是有匹配的重载普通函数模板 template <typename T> void func(T param, int num);,所以编译器选择该重载版本。