当需要对不同的类型使用同一种算法(同一个函数体)时,为了避免定义多个功能重复的函数,可以使用模板。然而,并非所有的类型都使用同一种算法,有些特定的类型需要单独处理,为了满足这种需求,C++ 允许对函数模板进行重载,程序员可以像重载常规函数那样重载模板定义。
我们定义了 Swap() 函数用来交换两个变量的值,一种方案是使用指针,另外一种方案是使用引用
//方案①:使用指针 template<typename T> void Swap(T *a, T *b){ T temp = *a; *a = *b; *b = temp; } //方案②:使用引用 template<class T> void Swap(T &a, T &b){ T temp = a; a = b; b = temp; }
这两种方案都可以交换 int、float、char、bool 等基本类型变量的值,但是却不能交换两个数组。
交换两个数组唯一的办法就是逐个交换所有的数组元素
template<typename T> void Swap(T a[], T b[], int len){ T temp; for(int i=0; i<len; i++){ temp = a[i]; a[i] = b[i]; b[i] = temp; } }
在该函数模板中,最后一个参数的类型为具体类型(int),而不是泛型。并不是所有的模板参数都必须被泛型化。
完整代码
#include <iostream> using namespace std; template<class T> void Swap(T &a, T &b); //模板①:交换基本类型的值 template<typename T> void Swap(T a[], T b[], int len); //模板②:交换两个数组 void printArray(int arr[], int len); //打印数组元素 int main(){ //交换基本类型的值 int m = 10, n = 99; Swap(m, n); //匹配模板① cout<<m<<", "<<n<<endl; //交换两个数组 int a[5] = { 1, 2, 3, 4, 5 }; int b[5] = { 10, 20, 30, 40, 50 }; int len = sizeof(a) / sizeof(int); //数组长度 Swap(a, b, len); //匹配模板② printArray(a, len); printArray(b, len); return 0; } template<class T> void Swap(T &a, T &b){ T temp = a; a = b; b = temp; } template<typename T> void Swap(T a[], T b[], int len){ T temp; for(int i=0; i<len; i++){ temp = a[i]; a[i] = b[i]; b[i] = temp; } } void printArray(int arr[], int len){ for(int i=0; i<len; i++){ if(i == len-1){ cout<<arr[i]<<endl; } else{ cout<<arr[i]<<", "; } } }
结果
99, 10 10, 20, 30, 40, 50 1, 2, 3, 4, 5
标签:temp,int,void,C++,Swap,template,重载,模板 From: https://www.cnblogs.com/uacs2024/p/18073889