携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情
1.普通函数与函数模板调用规则
-
调用规则如下:
-
- 如果函数模板和普通函数都可以实现,优先调用普通函数
-
- 可以通过空模板参数列表来强制调用函数模板
-
- 函数模板也可以发生重载
-
- 如果函数模板可以产生更好的匹配,优先调用函数模板
-
有时候编译器认为调用普通函数和模板函数都可以,只不过普通函数可以需要隐式转换,而模板函数如果推导出来类型,也是可以调用。这种情况下,编译器觉得模板更好匹配,隐式转换太麻烦,所以会优先调用函数模板 前面学习过 char在一定范围内是可以隐式转换为int类型,所以在test01()中,编译器认为两个函数都可以调用,但是模板匹配更好,所以调用了模板函数。
2.如果函数模板和普通函数都可以实现,优先调用普通函数
#include<iostream>
#include <fstream>
#include <string>
using namespace std;
void spr(int a, int b) {
cout << "a+b = " << a + b << endl;
cout << "调用的是普通函数 " << endl;
}
template<typename H>
void spr(H a, H b) {
cout << "a+b = " << a + b << endl;
cout << "调用的是函数模板 " << endl;
}
int main() {
int a = 10;
int b = 9;
spr(a, b);
system("pause");
return 0;
}
输出:
a+b = 19 调用的是普通函数 请按任意键继续. . .
3. 可以通过空模板参数列表来强制调用函数模板
void spr(int a, int b) {
cout << "a+b = " << a + b << endl;
cout << "调用的是普通函数 " << endl;
}
template<typename H>
void spr(H a, H b) {
cout << "a+b = " << a + b << endl;
cout << "调用的是函数模板 " << endl;
}
int main() {
int a = 10;
int b = 9;
spr<>(a, b);
system("pause");
return 0;
}
输出:
a+b = 19 调用的是函数模板 请按任意键继续. . .
4. 函数模板也可以发生重载
void spr(int a, int b) {
cout << "a+b = " << a + b << endl;
cout << "调用的是普通函数 " << endl;
}
template<typename H>
void spr(H a, H b) {
cout << "a+b = " << a + b << endl;
cout << "调用的是函数模板 " << endl;
}
template<typename H>
void spr(H a, H b,H c) {
cout << "a+b+c = " << a + b +c << endl;
cout << "调用的是重载的函数模板 " << endl;
}
int main() {
int a = 10;
int b = 9;
int c = 8;
spr(a,b,c);
system("pause");
return 0;
}
输出:
a+b+c = 27 调用的是重载的函数模板 请按任意键继续. . .
5. 如果函数模板可以产生更好的匹配,优先调用函数模板
void spr(int a, int b) {
cout << "a+b = " << a + b << endl;
cout << "调用的是普通函数 " << endl;
}
template<typename H>
void spr(H a, H b) {
cout << "a+b = " << a + b << endl;
cout << "调用的是函数模板 " << endl;
}
template<typename H>
void spr(H a, H b,H c) {
cout << "a+b+c = " << a + b +c << endl;
cout << "调用的是重载的函数模板 " << endl;
}
int main() {
char a = 'a';
char b = 'b';
int c = 8;
spr(a,b);
system("pause");
return 0;
}
输出:
a+b = 195 调用的是函数模板 请按任意键继续. . .