函数模板的概念和意义
-
思考问题:C++中有几种交换变量的方法?
-
交换变量的方法
1)定义宏代码块
优点:代码复用,适合所有的类型。
缺点:编译器不知道宏的存在,缺少类型检查。
#define SWAP(t, a, b) \
do \
{ \
t c = a; \
a = b; \
b = c; \
}while(0)
2)定义函数
优点:真正的函数调用,编译器对类型进行检查。
缺点:根据类型重复定义函数,无法代码复用。
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;
}
-
新的需求:C++中有没有解决方案集合两种方法的优点?
-
泛型编程的概念:
//不考虑具体数据类型的编程方式,对于Swap函数可以考虑下面的泛型写法。
void Swap(T& a,T& b)
{
T c = a;
a = b;
b = c;
}
//Swap泛型写法中的T不是一个具体的数据类型,而是泛指任意得数据类型
-
C++中的泛型模板:函数模板
-
一种特殊的函数可用于不同类型进行调用
-
看起来和普通函数很相似,区别是类型可被参数化
template <typename T>
void Swap(T& a, T& b)
{
T c = 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;
}
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 printflen(T a[],int len)
{
for(int i = 0;i < len;i++)
{
cout <<a[i]<< ",";
}
}
int main()
{
int a[6] = {5,3,6,4,1,2};
double b[5] = {1.2,3.2,0.1,4.3,2.3};
printflen(a,6);
cout << endl;
printflen(b,5);
Sort(a,6);
Sort(b,5);
cout << endl;
printflen(a,6);
cout << endl;
printflen(b,5);
return 0;
}
-
运行结果
-
小结
-
函数模板是泛型编程在C++中的应用方式之一
-
函数模板能够根据实参对参数类型进行推导
-
函数模板支持显式指定参数类型
-
函数模板是C++中重要的代码复用方式
主要记录的是学习听课的笔记