一、泛指编程
template<typename T> 告诉编译器使用函数模版,T表示泛指的类型,废话不多说,直接实践
二、示例
#include <iostream>
#include <cstring>
using namespace std;
#define GetArrayLen(array, len) (len = sizeof(array)/sizeof(array[0]))
template<typename T>
void Swap(T &a, T &b)
{
T t = a;
a = b;
b = t;
}
template<typename T>
void SelectSort(T *array, int length)
{
int min_index;
for (int i=0; i<length-1; i++)
{
min_index = i;
for (int j=i+1; j<length; j++)
{
if (array[j] < array[min_index])
{
min_index = j;
}
}
if (min_index != i)
{
Swap(array[min_index], array[i]);
}
}
}
template<typename T>
void BubbleSort(T *array, int length)
{
int min_index;
for (int i=0; i<length-1; i++)
{
for (int j=i+1; j<length; j++)
{
if (array[j] < array[i])
{
Swap(array[j], array[i]);
}
}
}
}
template<typename T>
void Print(T *array, int length)
{
for (int i = 0; i<length; i++)
{
cout<<array[i]<<endl;
}
}
int main()
{
int a = 1;
int b = 2;
Swap(a, b);
cout<<"a: "<<a <<" "<<"b: "<<b <<endl;
float fa = 1.1;
float fb = 2.2;
Swap(fa, fb);
cout<<"fa: "<<fa <<" "<<"fb: "<<fb <<endl;
char *str1 = "Hello";
char *str2 = "World";
Swap(str1, str2);
cout<<str1<<" "<<str2<<endl;
int array[] = {4,5,2,1,3,6,7,9,};
int len = 0;
GetArrayLen(array, len);
SelectSort<int>(array, len);
Print<int>(array, len);
BubbleSort<int>(array, len);
Print<int>(array, len);
return 0;
}
三、函数重载与模版
1、C++编译器会优先考虑普通函数
2、如果函数模版可以产生一个更好的匹配,那么会选择模版
3、可以通过空模版实参列表的语法限定编译器只通过模版来匹配函数
Note:
*普通函数会自动进行类型转换
*函数模版不会进行自动类型转换
#include <iostream>
#include <cstring>
using namespace std;
template<typename T>
T Max(T a, T b)
{
cout<< "T Max(T a, T b)"<<endl;
return a > b ? a : b;
}
int Max(int a, int b)
{
cout<< "int Max(int a, int b)"<<endl;
return a > b ? a : b;
}
template<typename T>
T Max(T a, T b, T c)
{
cout<< "T Max(T a, T b, T c)"<<endl;
return Max(Max(a, b), c);
}
template<typename RT, typename T1, typename T2>
RT Add(T1 a, T2 b)
{
cout<< "RT Add(T1 a, T2 b)"<<endl;
return static_cast<RT>(a + b);
}
int main()
{
int a = 1;
int b = 2;
int c = 3;
cout<<Max(a, b)<<endl;
cout<<Max<>(a, b)<<endl;
cout<<Max(1.1, 2.2)<<endl;
cout<<Max(a, b, c)<<endl;
cout<<Max('a', 100)<<endl;//必然调用普通函数,字符'a'将被打印为其对应的整形(ASCII码)
//多参数模版提供了解决方案,注意把返回值类型写在第一位
cout<<Add<double, double, double>('a', 3.3)<<endl;//等价于下一句
cout<<Add<double>('a', 3.3)<<endl;
return 0;
}