1009模板04普通函数与函数模板的调用规则

86 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情

1.普通函数与函数模板调用规则

  • 调用规则如下:

      1. 如果函数模板和普通函数都可以实现,优先调用普通函数
      1. 可以通过空模板参数列表来强制调用函数模板
      1. 函数模板也可以发生重载
      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 调用的是函数模板 请按任意键继续. . .