C++语言中的模板——函数模板

模板概述:
c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数 就成为函数模板。凡是函数体相同的函数都可以用这个模板代替,不必定义多个函 数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板 中的虚拟类型,从而实现不同函数的功能。
c++提供两种模板机制:函数模板和类模板 类属 - 类型参数化,又称参数模板
函数模板
函数模板的引入:
如果我们需要实现两个变量相交换:
整型变量交换

void Swap_Int(int& a, int& b)
{
	int temp;
	temp = b;
	b = a;
	a = temp;
}

字符变量交换

void Swap_Char(char& a, char& b)
{
	char temp;
	temp = b;
	b = a;
	a = temp;
}

我们如果要实现别的类型变量交换的时候需要写一个函数,但是我们发现交换函数写的时候只是参数变量类型和临时变量类型不一样,所以我们就需要一种类型的参数化。传什么类型就是什么类型,就是函数模板

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

用模板是为了实现泛型,可以减轻编程的工作量,增强函数的重用性。
函数模板和普通函数的区别
函数模板不允许自动类型转化 普通函数能够自动进行类型转化

#include <iostream>
#include <string>

using namespace std;

template <class T>
T Test_Add(T a, T b)
{
	return a + b;
}

int add(int a, char b)
{
	return a + b;
}
void test01()
{

	cout << Test_Add(1,3) << endl;//调用函数模板,第一个为整数,第二个也必须为整数
	cout << Test_Add(1,'2')<<endl;//这样会报错,因为它不能自动类型转换
	cout << add(1,'2') << endl;//普通函数可以进行自动类型转换
}
int main()
{
	test01();
	return 0;
}

函数模板和普通函数同时存在时的调用规则
c++编译器优先考虑普通函数 可以通过空模板实参列表的语法限定编译器只能通 过模板匹配 函数模板可以像普通函数那样可以被重载 如果函数模板可以产生一个 更好的匹配,那么选择模板


template <class T>
T Test_Add(T a, T b)
{
	cout << "模板函数调用" << endl;
	return a + b;
}

int Test_Add(int a, int b)
{
	return a + b;
}
void test01()
{
	int a = 100;
	int b = 100;
	char c = 'c';
	char d = 'd';
	cout << Test_Add(a,b) << endl;//如果函数模板和普通函数都能匹配,c++编译器优先考虑普通函数
	cout << Test_Add<>(a, b) << endl;//强行调用模板函数
	cout << Test_Add(c, d) << endl;//模板函数比普通函数更匹配,所以调用模板函数
}
//如果函数模板和普通函数都能匹配,c++编译器优先考虑普通函数

模板函数实现机制:
编译器并不是把函数模板处理成能够处理任何类型的函数 函 数模板通过具体类型产生不同的函数 编译器会对函数模板进行两次编译,在声明 的地方对模板代码本身进行编译,在调用的地方对参数替换后的 代码进行编译。
模板的局限性:
如果有以下代码:

template<class T> void f(T a, T b) {}

如果代码实现时定义了赋值操作 a = b,但是 T 为数组,这种假设就不成立了 同 样,如果里面的语句为判断语句 if(a>b),但 T 如果是结构体,该假设也不成立,另 外如果是传入的数组,数组名为地址,因此它比较的是地址,而这也不是我们所希 望的操作。 总之,编写的模板函数很可能无法处理某些类型,另一方面,有时候 通用化是有意义的,但 C++语法不允许这样做。为了解决这种问题,可以提供模板 的重载,为这些特定的类型提供具体化的模板。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值