//交换 int 变量的值 void Swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp; } //交换 float 变量的值 void Swap(float *a, float *b){ float temp = *a; *a = *b; *b = temp; } //交换 char 变量的值 void Swap(char *a, char *b){ char temp = *a; *a = *b; *b = temp; } //交换 bool 变量的值 void Swap(bool *a, bool *b){ char temp = *a; *a = *b; *b = temp; }这些函数虽然在调用时方便了一些,但从本质上说还是定义了三个功能相同、函数体相同的函数,只是数据的类型不同而已,这看起来有点浪费代码,能不能把它们压缩成一个函数呢?
#include <iostream> using namespace std; template<typename T> void Swap(T *a, T *b){ T temp = *a; *a = *b; *b = temp; } int main(){ //交换 int 变量的值 int n1 = 100, n2 = 200; Swap(&n1, &n2); cout<<n1<<", "<<n2<<endl; //交换 float 变量的值 float f1 = 12.5, f2 = 56.93; Swap(&f1, &f2); cout<<f1<<", "<<f2<<endl; //交换 char 变量的值 char c1 = 'A', c2 = 'B'; Swap(&c1, &c2); cout<<c1<<", "<<c2<<endl; //交换 bool 变量的值 bool b1 = false, b2 = true; Swap(&b1, &b2); cout<<b1<<", "<<b2<<endl; return 0; }运行结果:
template
是定义函数模板的关键字,它后面紧跟尖括号<>
,尖括号包围的是类型参数(也可以说是虚拟的类型,或者说是类型占位符)。typename
是另外一个关键字,用来声明具体的类型参数,这里的类型参数就是T
。从整体上看,template<typename T>
被称为模板头。T
。#include <iostream> using namespace std; template<typename T> void Swap(T &a, T &b){ T temp = a; a = b; b = temp; } int main(){ //交换 int 变量的值 int n1 = 100, n2 = 200; Swap(n1, n2); cout<<n1<<", "<<n2<<endl; //交换 float 变量的值 float f1 = 12.5, f2 = 56.93; Swap(f1, f2); cout<<f1<<", "<<f2<<endl; //交换 char 变量的值 char c1 = 'A', c2 = 'B'; Swap(c1, c2); cout<<c1<<", "<<c2<<endl; //交换 bool 变量的值 bool b1 = false, b2 = true; Swap(b1, b2); cout<<b1<<", "<<b2<<endl; return 0; }引用不但使得函数定义简洁明了,也使得调用函数方便了很多。整体来看,引用让编码更加漂亮。
template <typename 类型参数1 , typename 类型参数2 , ...> 返回值类型 函数名(形参列表){
//在函数体中可以使用类型参数
}
,
分隔。类型参数列表以< >
包围,形式参数列表以( )
包围。typename
关键字也可以使用class
关键字替代,它们没有任何区别。C++ 早期对模板的支持并不严谨,没有引入新的关键字,而是用 class 来指明类型参数,但是 class 关键字本来已经用在类的定义中了,这样做显得不太友好,所以后来 C++ 又引入了一个新的关键字 typename,专门用来定义类型参数。不过至今仍然有很多代码在使用 class 关键字,包括 C++ 标准库、一些开源程序等。template<class T> void Swap(T &a, T &b){ T temp = a; a = b; b = temp; }除了将 typename 替换为 class,其他都是一样的。
#include <iostream> using namespace std; //声明函数模板 template<typename T> T max(T a, T b, T c); int main( ){ //求三个整数的最大值 int i1, i2, i3, i_max; cin >> i1 >> i2 >> i3; i_max = max(i1,i2,i3); cout << "i_max=" << i_max << endl; //求三个浮点数的最大值 double d1, d2, d3, d_max; cin >> d1 >> d2 >> d3; d_max = max(d1,d2,d3); cout << "d_max=" << d_max << endl; //求三个长整型数的最大值 long g1, g2, g3, g_max; cin >> g1 >> g2 >> g3; g_max = max(g1,g2,g3); cout << "g_max=" << g_max << endl; return 0; } //定义函数模板 template<typename T> //模板头,这里不能有分号 T max(T a, T b, T c){ //函数头 T max_num = a; if(b > max_num) max_num = b; if(c > max_num) max_num = c; return max_num; }运行结果:
本文链接:http://task.lmcjl.com/news/8690.html