[Lang] 函数模板
1. 自动类型推导和显示指定类型
- 自动类型推导不能进行隐式类型转换。
- 显式指定类型可以进行隐式类型转换。但前提是函数模板的参数必须按值传递,因为按引用传递不支持隐式类型转换。
#include<iostream>
using namespace std;
template <typename T>
T myAdd(T a, T b)
{
return a + b;
}
int main()
{
int a = 10;
char b = 'a';
// cout << myAdd(a, b) << endl;
// 自动类型推导不能进行隐式类型转换
cout << myAdd<int>(a, b) << endl;
// 显式指定类型可以进行隐式类型转换
// 但前提是函数模板的参数必须按值传递,因为按引用传递不支持隐式类型转换
return 0;
}
107
2. 普通函数和函数模板调用优先级
- 普通函数优先级高于函数模板。
- 除非函数模板存在比普通函数更好的匹配(不需要隐式类型转换),或者使用空模板参数列表强制调用函数模板。
#include<iostream>
using namespace std;
template <typename T>
T myAdd(T &a, T &b)
{
cout << "函数模板调用" << endl;
return a + b;
}
int myAdd(int &a, int &b)
{
cout << "普通函数调用" << endl;
return a + b;
}
int main()
{
int a = 10, b = 20;
cout << myAdd(a, b) << endl;
// 普通函数优先级高于函数模板
char c = '1', d = '2';
cout << myAdd(c, d) << endl;
// 除非函数模板存在比普通函数更好的匹配(不需要隐式类型转换)
cout << myAdd<>(a, b) << endl;
// 或者使用空模板参数列表
return 0;
}
普通函数调用
30
函数模板调用
c
函数模板调用
30
3. 函数模板完全特化
#include <iostream>
using namespace std;
// 通用函数模板
template <typename T>
void func(T param) {
cout << "Generic template function: " << param << endl;
}
// 针对 int 类型的完全特化
template <>
void func(int param) {
cout << "Specialized template function for int: " << param << endl;
}
int main() {
func(42); // 调用特化的 int 版本
func(3.14); // 调用通用模板版本
func("Hello"); // 调用通用模板版本
return 0;
}
Specialized template function for int: 42
Generic template function: 3.14
Generic template function: Hello
标签:Lang,类型转换,cout,int,template,模板,函数
From: https://www.cnblogs.com/yaoguyuan/p/18365734