面试题答案
一键面试不同点
- 函数模板全特化:
- 当存在函数模板全特化时,只有当函数调用的参数类型与全特化模板的参数类型完全匹配时,才会选择全特化版本。它是对特定类型的完全定制,优先级高于普通函数模板。
- 函数模板重载:
- 函数模板重载是提供多个不同参数列表的函数模板。在函数调用时,编译器会根据实参的类型和个数,按照函数重载的规则来选择最合适的模板实例化版本。它更侧重于根据不同的参数形式提供不同的实现。
代码示例
#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)
版本。