C++模板的使用可以提升代码的通用性、可移植性。方便通用库的开发。
与模板有关的关键字有两个:
template 定义模板所用到的关键字。
typename 类型的名字,比如int,double,可以使用类类型,struck类型等。也可以使用class关键字来代替typename,但是推荐使用template。
模板函数的形式如下,一个可以比较大小的函数模板
#include <iostream>
template <typename T>
T max(T a, T b)
{
return a > b ? a : b;
}
int main()
{
std::cout << max(3, 5) << std::endl;
return 0;
}
代码很好理解:
声明一个模板max,模板使用的未知类型只有一种使用T来代替;
函数的返回值与输入参数的类型相同;
T max(T a, T b) 说明a,b 以及函数的返回值类型相同;
在main 函数内对模板进行了调用
max(3,5); //返回值为5;
相当于调用了如下函数,编译器从函数调用传入实参分别为数值3 5,即整形(int)
int max(int a, int b)
{
return a > b ? a : b;
}
上面调用使的是编译器自动判定T的类型,我们也可以指定T的类型
max<double>(3.5, 5)//返回值为5.0 double类型
//相当于调用了如下函数
double max(double a, double b)
{
return a > b ? a : b;
}
当在程序中使用模板函数或者模板类时,编译器会生成多个版本的“同名函数”或者“同名类”。如上文会生成一个int 版本的一个double的版本,有点和同名不同类型参数的重载函数相似,但只需要书写一边。甚至类型也可以是类 类型,当然必须要重载 > ;
template <typename T>
T max(T a, T b)
{
return a > b ? a : b;
}
class Data
{
public:
Data(double i) :a(i)
{ }
bool operator >(Data& data)//重载 > 使max函数可以进行计算比较两个Data类型的大小。
{
return this->a > data.a ? true : false;
}
double a;
};
int main()
{
Data data1(3), data2(5);
Data data = max<Data>(data1, data2);
std::cout << data.a << std::endl;
return 0;
}