C++学习笔记(六) 模板(一) 函数模板

1.模板

1.1 函数模板

函数模板不指定函数的形参类型,调用时自动确定形参的类型,可以提高函数的通用性

#include <iostream>
#include <string>
#include <fstream> /* 首先要包含头文件 */
using namespace std;

template<typename T>  /* template关键字下面紧跟着的函数是函数模板,T相当于是任意类型,调用该函数时确定 */
void SwapNum(T& a, T& b)
{
	T temp = a;
	a = b;
	b = temp;
}

template<typename T>  
void TestFunc(T a, T b)
{
	cout << a + b << endl;
}

void test_1(void)
{
	int a = 10, b = 20;
	cout << "a:" << a << " " << "b:" << b << endl;
	SwapNum(a, b); 			/* 自动推导类型, a:20 b:10*/
	cout << "a:" << a << " " << "b:" << b << endl;

	char c = 'a';
	// TestFunc(a, c);				/* 这个时候就会报错,自动推导必须传入相同类型的变量。或者没有传参,自动推导无法确定T到底是什么类型 */
	TestFunc<int>(a, c);		/* 然后你随便显式指定一下类型就行了.显式指定之后是可以发生隐式类型转换的,把char转为c,这与普通函数是一样的, 117 */
}

int main(void)
{
	test_1();
	return 0;
}

1.2 普通函数和函数模板调用规则

当出现同名的普通函数和函数模板时,调用规则如下

  1. 如果普通函数和函数模板都存在,优先调用普通函数
  2. 加上模板函数的参数列表<>后,可以强制调用函数模板
  3. 函数模板也可重载
  4. 如果函数模板能对传入参数进行更好的匹配,就调用函数模板

但是一般项目中尽量不要写同名的普通函数和函数模板。

#include <iostream>
#include <string>
using namespace std;


void TestFunc(int a, int b)
{
	cout << "调用普通函数:" << a + b << endl;
}
template<typename T>  /* template关键字下面紧跟着的函数是函数模板,T相当于是任意类型,根据调用该函数时确定 */
void TestFunc(T a, T b)
{
		cout << "调用函数模板:" << a + b << endl;
}

template<typename T> 
void TestFunc(T a, T b, T c)
{
		cout << "调用函数模板的重载函数:" << a + b + c<< endl;
}

void test_1(void)
{
	int a = 10, b = 20, c = 30;
	TestFunc(a, b);			/* 如果普通函数和函数模板都存在,优先调用普通函数 */				
	TestFunc<>(a, b);		/* 加上模板函数的参数列表<>后,可以强制调用函数模板 */
	TestFunc<>(a, b, c);	/* 函数模板也可重载 */

	char c1 = 'a', c2 = 'b';
	TestFunc(c1, c2);		/* 如果函数模板能对传入参数进行更好的匹配,就调用函数模板 */

}

int main(void)
{
	test_1();
	return 0;
}

上述代码运行结果如下

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值