MST

星途 面试题库

面试题:C++ 中函数模板全特化与重载在参数匹配上的区别

请简述在 C++ 中函数模板全特化与函数模板重载在参数匹配规则上有哪些不同,并通过代码示例说明。
18.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

不同点

  1. 函数模板全特化
    • 当存在函数模板全特化时,只有当函数调用的参数类型与全特化模板的参数类型完全匹配时,才会选择全特化版本。它是对特定类型的完全定制,优先级高于普通函数模板。
  2. 函数模板重载
    • 函数模板重载是提供多个不同参数列表的函数模板。在函数调用时,编译器会根据实参的类型和个数,按照函数重载的规则来选择最合适的模板实例化版本。它更侧重于根据不同的参数形式提供不同的实现。

代码示例

#include <iostream>

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

// 函数模板全特化
template <>
void func<int>(int t) {
    std::cout << "函数模板全特化(int): " << t << std::endl;
}

// 函数模板重载
template <typename T1, typename T2>
void func(T1 t1, T2 t2) {
    std::cout << "函数模板重载: " << t1 << " " << t2 << std::endl;
}

int main() {
    func(10); // 调用函数模板全特化版本
    func(10.5); // 调用普通函数模板
    func(10, 20); // 调用函数模板重载版本
    return 0;
}

在上述代码中:

  • 对于func(10),因为有func<int>的全特化版本,且参数类型完全匹配,所以调用全特化版本。
  • func(10.5),没有对应的全特化版本,所以调用普通函数模板。
  • func(10, 20),匹配函数模板重载的func(T1 t1, T2 t2)版本。