C++函数模板(Function Template)

Posted 小柯南有话说

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++函数模板(Function Template)相关的知识,希望对你有一定的参考价值。


        暑期降温          小柯贴心 C++函数模板(Function Template)
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;}














C++函数模板(Function Template)

这些函数虽然在调用时方便了那么一丢丢,可是,从本质上说还是定义了三个功能相同、函数体相同的函数,只是数据的类型不同而已。


这看起来貌似有点浪费代码,那能不能把它们压缩成一个函数呢?

C++函数模板(Function Template)

答案当然是可以的,这就需要引入我们今天模板的概念。

C++函数模板(Function Template)









//使用模板实现函数值的交换#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;}













C++函数模板(Function Template)

template是定义函数模板的关键字,它后面紧跟尖括号<>,尖括号包围的是类型参数(也可以说是虚拟的类型,或者说是类型占位符)。


typename是另外一个关键字,用来声明具体的类型参数,这里的类型参数就是T。


从整体上看,template<typename T>被称为模板头。


C++函数模板(Function Template)

我们在学习C++函数重载时我们还没有学到引用(Reference),为了达到交换两个变量的值的目的只能使用指针,而现在我们已经对引用有所了解,所以我们可以试试使用引用重新实现 Swap() 这个函数模板:










#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 = 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

C++ function template name binding

带有模板的 C++ 函数指针

[ C++ ] C++之模板template

如何在 SWIG 中为 c++ 创建模板函数?

如何在 C++ 中为模板化函数创建宏