C++函数模板(Function Template)
Posted 小柯南有话说
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++函数模板(Function Template)相关的知识,希望对你有一定的参考价值。
作者姓名:小柯南
性别 :男
联系方式:it_c_xiaobai
BOUTBEAUTY
关于函数重载
曾记否?我们在之前学习函数重载时,为了交换不同类型的变量的值,我们通过函数重载定义了四个名字相同、参数列表不同的函数,忘了?没关系,我们来回顾下。
//交换 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;
}
这些函数虽然在调用时方便了那么一丢丢,可是,从本质上说还是定义了三个功能相同、函数体相同的函数,只是数据的类型不同而已。
这看起来貌似有点浪费代码,那能不能把它们压缩成一个函数呢?
答案当然是可以的,这就需要引入我们今天模板的概念。
//使用模板实现函数值的交换
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>被称为模板头。
我们在学习C++函数重载时我们还没有学到引用(Reference),为了达到交换两个变量的值的目的只能使用指针,而现在我们已经对引用有所了解,所以我们可以试试使用引用重新实现 Swap() 这个函数模板:
using namespace std;
template<typename T> void Swap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
int main() {
//交换 int 变量的值
int n1 = 10;int n2 = 20;
Swap(n1, n2);
cout << n1 << ", " << n2 << endl;
//交换 float 变量的值
float f1 = 17.3, f2 = 62.1;
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 , ...> 返回值类型 函数名(形参列表){ //在函数体中可以使用类型参数 } |
以上是关于C++函数模板(Function Template)的主要内容,如果未能解决你的问题,请参考以下文章
C++ function template name binding