函数模板一
来源:互联网 发布:微信联系人数据库修复 编辑:程序博客网 时间:2024/06/07 02:43
c++新增特性–函数模板。函数模板是通用的函数描述,也就是说,采用泛型编程,其中的泛型可以使用具体的类型(如int或double)替换,通常将类型作为参数传递给模板,可使编译器生成该类型的函数。
应用场景:比如现在已有一个交换两个 int 值的函数 Swap,当我们想交换两个 double 值时或 char 值时,一种办法是复制原先的代码,将 int 全部改为double或char,而c++的函数模板功能可以方便的完成这一功能,函数模板允许以任意类型的方式定义函数。
一. 函数模板的定义
template <typename T>void Swap(T &a,T &b){ T temp; temp=b; b=a; a=temp;}
第一行指出要建立一个模板,①关键字template和typename不可少(有时可以使用class代替typename),并将此类型命名为T;②必须使用尖括号;③类型名可以任意选择,只要符合c++命名规则即可。
下面的栗子描述交换两个值的程序:
#include <iostream>using namespace std;template<typename T>//模板原型void Swap(T &a,T &b);int main(){ int a=12,b=34; cout<<"Original,a,b= "<<a<<","<<b<<endl; Swap(a,b); cout<<"Now,a,b= "<<a<<","<<b<<endl; double c=12.0,d=34.12; cout<<"Original,c,d= "<<c<<","<<d<<endl; Swap(c,d); cout<<"Now,c,d= "<<c<<","<<d<<endl; return 0;} template<typename T>//模板定义void Swap(T &a,T &b){ T temp; temp=a; a=b; b=temp;}
输出:
注意:函数模板不能缩短可执行程序,对于此程序来说,最终有两个独立的函数定义,就像以手工方式定义了这两个函数一样。最终代码不包括任何模板,而只包含了为程序生成的实际函数。使用模板的好处是,它使生成多个函数定义更简单、更可靠。
2. 重载的模板
需要多个对不同类型使用同一算法的函数时,可使用模板,然而,并非所有的类型都使用同一算法,此时,可以像常规函数重载 那样,重载模板函数,被重载的模板函数特征标必须不同。例如,在上述交换两个值的模板基础上,新增交换两个数组元素的模板,原来的模板特征标是(T &a,T &b),现在的模板特征标是(T a[ ],T b[ ], int n)。
将上述例子加入模板重载之后,程序如下:
#include <iostream>using namespace std;const int MaxNum=4;template<typename T>//模板原型void Swap(T &a,T &b);template<typename T>void Swap(T a[],T b[], int n);template<typename T>void show(T a[],int n);int main(){ int a=12,b=34; cout<<"Original,a,b= "<<a<<","<<b<<endl; Swap(a,b); cout<<"Now,a,b= "<<a<<","<<b<<endl; double c=12.0,d=34.12; cout<<"Original,c,d= "<<c<<","<<d<<endl; Swap(c,d); cout<<"Now,c,d= "<<c<<","<<d<<endl; int arr1[MaxNum]={1,2,3,4}; int arr2[MaxNum]={5,6,7,8}; cout<<"Original, arr1数组元素有: "<<endl; show(arr1,MaxNum); cout<<"Original, arr2数组元素有: "<<endl; show(arr2,MaxNum); Swap(arr1,arr2,MaxNum); cout<<"Now, arr1数组元素有: "<<endl; show(arr1,MaxNum); cout<<"Now, arr2数组元素有: "<<endl; show(arr2,MaxNum); return 0;} template<typename T>//模板定义void Swap(T &a,T &b){ T temp; temp=a; a=b; b=temp;}template<typename T>void Swap(T a[],T b[], int n){ for (int i=0;i<n;i++) { T temp; temp=a[i]; a[i]=b[i]; b[i]=temp; }}template<typename T>void show(T a[],int n){ for (int i=0;i<n;i++) { cout<<"数组的第"<<i+1<<"个元素:"<<a[i]<<endl; }}
输出:
阅读全文
0 0
- C++模板(一)-函数模板
- 模板(一)----->函数模板
- 函数模板(一)
- 函数模板一
- C++模板(一) ----函数模板
- (一)函数模板与类模板 Template
- 函数模板特化(一)
- 从零开始学C++之模板(一):函数模板、函数模板特化、重载函数模板、非模板函数重载
- 从零开始学C++之模板(一):函数模板、函数模板特化、重载函数模板、非模板函数重载
- 模板之泛化仿函数(一)
- c++函数模板入门(一)
- (一〇六)函数模板
- 第十四周项目一 排序函数模板
- 第十四周项目一 排序函数模板
- 第十四周项目一排序函数模板
- 第十四周项目一-排序函数模板
- 第十四周项目一排序函数模板
- 一:函数模板(Function Template)
- 为什么 superSocket 所接收的数据会丢失最前面一段
- Jetson TX1使用记录
- jmeter ftp测试
- leetcode--Shortest Word Distance II
- 《现代操作系统》(第3版)读书笔记(1)之系统调用(关键词:操作系统/系统调用)
- 函数模板一
- onmusewheel事件(兼容IE,FF,opera,safari,chrome)
- Session会在浏览器关闭后消失吗?
- ViewPager中嵌套VieRecyclerView 滑动事件解决
- 第一个博客
- DDD、CQRS、Event Sourcing
- 测试字节序
- 自定义控件三部曲之绘图篇(十)——Paint之setXfermode(一)
- 服务端常用的架构