56、函数模板的概念和意义

1、发散性的问题:

C++中有几种交换变量的方法?
答:两种,定义宏代码块 VS 定义函数

#define SWAP(t,a,b) \
{                   \
	t c = a;        \
	a = b;          \
	b = c;          \
}
void Swap(int& a, int& b)
{
	int c = a;
	a = b;
	b = c;
}

定义宏代码块 和 定义函数都能交换变量。但是对于宏代码块,是由预处理器处理,编译器不知道宏代码块的存在。定义函数的话一次只能实现一种类型的交换,重复造轮子并不是一件很好的事。

#include <iostream>
#include <string>

using namespace std;
#define SWAP(type,a,b)\
{                     \
	type c = a;       \
	a = b;            \
	b = c;            \
}

void Swap(int& a, int& b)
{
	int c = a;
	a = b;
	b = c;
}
void Swap(double& a, double& b)
{
	double c = a;
	a = b;
	b = c;
}
void Swap(string& a, string& b)
{
	string c = a;
	a = b;
	b = c;
}
int main()
{
	int a = 1;
	int b = 2;

	Swap(a, b);

	cout << "a = " << a << endl;
	cout << "b = " << b << endl;

	double m = 3;
	double n = 4;

	Swap(m, n);

	cout << "m = " << m << endl;
	cout << "n = " << n << endl;

	string sa = "xiebs";
	string sb = "xieps";

	Swap(sa, sb);

	cout << "sa = " << sa << endl;
	cout << "sb = " << sb << endl;
	return 0;
}

在这里插入图片描述

2、交换变量的方法

  • 定义宏代码块
    — 优点:代码复用,适合所有类型
    — 缺点:编译器不知道宏的存在,缺少类型检查
  • 定义函数
    — 优点:真正的函数调用,编译器对类型进行检查
    — 缺点:根据类型重复定义函数,无法代码复用。

C++中有没有解决方案集合两种方法的优点?

3、泛型编程

  • 泛型编程的概念:不考虑具体数据类型的编程方式

泛型写法:

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

这里面的 T 不是一个具体的类型,泛指任意的数据类型

4、函数模板

  • C++中的泛型编程:函数模板
      1、一种特殊的函数可用不同的类型调用
      2、看起来和普通函数很相似,区别是类型可被参数化
template<typename T>
void Swap(T& a, T& b)
{
	T t = a;
	a = b;
	b = c;
}
  • 函数模板的语法规则
    — template 关键字用于声明开始进行泛型编程
    — typename 关键字用于声明泛指类型
    在这里插入图片描述
  • 函数模板的使用
    — 自动类型推导
    — 具体类型显示调用
int a = 0;
int b = 1;

Swap(a, b);  				//自动推导

float c = 2;
float d = 3;

Swap <float>(c, d);  		//显示调用
#include <iostream>
#include <string>

using namespace std;
template <typename T>
void Swap(T& a, T&b)
{
	T c = a;
	a = b;
	b = c;
}
int main()
{
	int a = 1;
	int b = 2;

	Swap(a, b);						//Swap<int>(a,b);

	cout << "a = " << a << endl;
	cout << "b = " << b << endl;

	double m = 3;
	double n = 4;

	Swap(m, n);						//Swap<double>(a,b);

	cout << "m = " << m << endl;
	cout << "n = " << n << endl;

	string sa = "xiebs";
	string sb = "xieps";

	Swap(sa, sb);					//Swap<string>(sa,sb);

	cout << "sa = " << sa << endl;
	cout << "sb = " << sb << endl;
	return 0;
}

在这里插入图片描述
程序:

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

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

template<typename T>
void Sort(T a[],int len)
{
	for (int i = 0; i < len; i++)
	{
		for (int j = i + 1; j < len; j++)
		{
			if (a[i]>a[j])
			{
				Swap(a[i],a[j]);
			}
		}
	}
}

template<typename T>
void println(T a[], int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << a[i] <<", ";
	}
	cout << endl;
}
int main()
{
	int a[5] = { 4,5,2,3,1 };
	println(a, 5);
	Sort(a, 5);
	println(a, 5);

	string s[5] = { "Java","Basic","Pascal","C++","Patyon" };
	println(s, 5);
	Sort(s, 5);
	println(s, 5);

	return 0;
}

在这里插入图片描述

小结

  • 函数模板是泛型编程在C++中的应用方式之一
  • 函数模板能够根据实参对参数类型进行推导
  • 函数模板支持显示的指定参数类型
  • 函数模板是C++中重要的代码复用方式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值