C++模板函数

模板

  • 用处:建立通用的摸具,大大提高了利用率
  • 特点:(1)模板不能直接使用,它只是一个框架;(2)模板的通用并不是万能的

函数模板

作用:建立一个通用函数,其返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。

语法: template < typename T > 函数声明或定义

  • template —— 声明创建模板
  • typename —— 表明其后的符号是一种数据类型,可以用class代替
  • T —— 通用数据类型,名称可以替换,通常为大写字母
//声明一个模板,告诉编译器后面代码中的T是一个通用类型,不要报错
template <typename T>
void mySwap(T &a, T &b) {
	T temp = a;
	a = b;
	b = temp;
}

int main() {
	int a = 10;
	int b = 20;
	//使用方法
	//1.自动类型推导
	mySwap(a, b);

	//2.显示指定类型
	mySwap<int>(a, b);

	return 0;
}
1. 注意事项:

(1)自动类型推导,必须推到出一致的数据类型T才可以使用
在这里插入图片描述

(2)模板函数必须要确定出T的类型才可使用
在这里插入图片描述
所以想要使用的话,必须显示指定类型,如下
在这里插入图片描述

一个简单的例程,实现排序算法的模板函数。

template <typename T>
void mySwap(T &a, T &b) {
	T temp = a;
	a = b;
	b = temp;
}

template <typename T>
void mySort(T arr[], int len) {
	for (int i = 0; i < len; i++) {
		int min = i;
		for (int j = i + 1; j < len; j++) {
			if (arr[min] > arr[j]) {
				min = j;
			}
		}
		if (min != i) {
			mySwap(arr[min], arr[i]);
		}
	}
}

int main() {
	char s[] = "gfseab";
	cout << "before sort: " << s << endl;
	mySort(s, strlen(s));
	cout << "after  sort: " << s << endl;
	system("pause");
	return 0;
}
2. 普通函数与函数模板的区别:
  • 普遍函数调用可以发生隐式类型转化
  • 函数模板用 自动类型 推导时,不能发生隐式类型转化
  • 函数模板用 显示指定 类型时,可以发生隐式类型转化
3. 普通函数和函数模板的调用规则:
  • (1)如果普通函数和函数模板都可调用,优先用普通函数
  • (2)可以通过空模板参数列表 强制调用 函数模板
  • (3)函数模板可以重载
void func(int a, int b) {
	cout << "普通函数调用" << endl;
}

template<typename T>
void func(T a, T b) {
	cout << "函数模板的调用" << endl;
}

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

int main() {
	int a = 10, b = 10;
	func(a, b);
	func<>(a, b);//通过空模板参数类别,强制调用函数模板
	func(a, b, 10);
	system("pause");
	return 0;
}

在这里插入图片描述

  • (4)如果函数模板可以产生更好的匹配,优先调用函数模板
void func(int a, int b) {
	cout << "普通函数调用" << endl;
}

template<typename T>
void func(T a, T b) {
	cout << "函数模板的调用" << endl;
}

int main() {
	char a = 'a', b = 'b';
	func(a, b);
	system("pause");
	return 0;
}

在这里插入图片描述

4. 模板不是万能的
  • 比如一个比较的函数模板,就不能实现自定义数据类型(类)的比较,使用时必须进行重载
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值