泛型编程是工程开发中必用的技术,在大型公司里面一般都有自己的通用库,而这些通用库都是使用泛型编程来完成的。在C++中支持泛型编程的技术。C++中函数模板和类模板就是使用泛型编程技术。接下来我们就来学习下使用泛型编程技术实现的函数模板。
一、发散性问题
1、 C++中有几种交换变量的方法
(1)定义宏代码块
(2)定义函数
示例:宏代码块VS函数
#include <iostream>
#include <string>
using namespace std;
#define SWAP(t,a,b) \
do \
{ \
t c = a; \
a = b; \
b = c; \
\
}while(0)
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 = 1;
double n = 2;
Swap(m,n);
cout << "m = " << m << endl;
cout << "n = " << n << endl;
string t = "Zhang";
string d = "Ge";
Swap(t,d);
cout << "t = " << t << endl;
cout << "d = " << d << endl;
return 0;
}
定义宏代码块
优点:代码复用,适合所有类型
缺点:编译器不知道宏的存在,缺少类型检查
定义函数
优点:真正的函数调用,编译器会对类型进行检查
缺点:根据类型重复定义函数,无法代码复用
二、新的需求
1、C++中有没有解决方案集合两种方法的优点?
答案是肯定的。C++支持泛型编程。
扫描二维码关注公众号,回复:
2879469 查看本文章
2、泛型编程的概念
不考虑具体类型的编程方式,只考虑实现的具体功能
对于Swap函数可以考虑下面的泛型写法
void Swap(T& a,T& b)
{
T t = a;
a = b;
b = t;
}
这里的T不是一个具体的数据类型,而是泛指任意的数据类型
3、C++中的泛型编程
(1)函数模板
- 一种特殊的函数可用不同类型进行调用
- 看起来和普通函数很相似,区别是类型可被参数化
(2)函数模板的语法规则
template <typename T>
template<typename T>
void Swap(T& a,T& b)
{
T t = a;
a = b;
b = t;
}
-
template关键字用于声明开始进行泛型编程
-
typename关键字用于声明泛指类型
(3)函数模板的使用
- 自动类型推导调用
- 具体类型显示调用
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;
}
template<typename T>
void sort(T a[],int len)
{
for(int i = 0;i < len;i++)
{
for(int j = i;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] = {5,4,3,1,2};
Println(a,5);
sort(a,5);
Println(a,5);
string s[5] = {"Java", "C++", "Pascal", "Ruby", "Basic"};
Println(s,5);
sort(s,5);
Println(s,5);
return 0;
}
打印结果
上述代码中使用模板技术做的排序算法,我们只需要定义一次函数,就可以完成任意类型的排序算法了。由此可以看出函数模板的强大之处了。
小结
-
函数模板是泛型编程在C++中的应用方式之一
-
函数模板能够根据实参对参数类型进行推导
-
函数模板支持显示的指定参数类型
-
函数模板是C++中重要的代码复用方式