C++模板是泛型编程基础,泛型编程即以一种独立于任何特定类型的方式编写代码。
为什么要使用模板,有哪些好处呢,首先来看下面一个示例
#include <iostream>
using namespace std;
int max(int a, int b)
{
return a > b ? a : b;
}
float max(float a, float b)
{
return a > b ? a : b;
}
double max(double a, double b)
{
return a > b ? a : b;
}
char max(char a, char b)
{
return a > b ? a : b;
}
int main()
{
cout << "int ret == " << max(10, 20) << endl;
cout << "double ret == " << max(19.5, 8.5) << endl;
cout << "float ret == " << max(10.6f, 29.7f) << endl;
cout << "char ret == " << max('A', 'd') << endl;
cout << "Hello World!" << endl;
return 0;
}

同样是比较大小的函数,功能一样,只是因为类型不同就得定义每种类型的函数,代码量变得冗余盘杂。而C++模板则可以解决类似的这种问题。模板是一些为多种类型而编写的函数和类,而且这些类型都没有指定。当使用模板的时候,你只需要把所希望的类型作为一个(显式或者隐式的)实参传递给模板,另外,则于模板是语言本身所具有的特性,所以它完全支持类型检查和作用域。
模板的定义
template <typename type>
ret-type func-name(parameter list)
{
// 函数的主体
}
template <typename 形参名,typename 形参名,......>
返回类型 函数名(参数列表)
{
函数体
}typename也可以用class代替,为了区分类模板,我们统一用typename.
1.函数模板的使用
#include <iostream>
using namespace std;
template <typename T>
T const& tmax(T const &a, T const &b)
{
return a > b ? a : b;
}
int main()
{
int i = 10;
int j = 20;
double d1 = 19.5;
double d2 = 8.5;
float f1 = 10.6f;
float f2 = 29.7f;
char c1 = 'A';
char c2 = 'd';
cout << "int tmax ret == " << tmax(i, j) << endl;
cout << "double tmax ret == " << tmax(d1, d2) << endl;
cout << "float tmax ret == " << tmax(f1, f2) << endl;
cout << "char tmax ret == " << tmax(c1, c2) << endl;
cout << "Hello World!" << endl;
return 0;
}

运行结果是一样的
2.实参的演绎
当我们为某些实参调用一个诸如max()的模板时,模板参数可以由我们所传递的实参来问心有愧定。如果我们传递了两个int给参数类型T const&,那么C++编译器能够得出结论:T必须是int,这里不允许进行自动类型转换,每个T都必须正确地匹配。列如:
tmax(4, 8.5);//错误,第一个为int, 第二个为double没有匹配的函数解决这类问题有三种方式
1:对实参进行强制类型转换,使它们可以互相匹配
cout << "tmax ret == " << tmax(static_cast<double>(4), d2) << endl;2:显示指定T的类型:
cout << "tmax ret == " << tmax<double>(4, d2) << endl;3.指定两个参数可以具有不同的类型。后续介绍

版权声明:本文为chenyijun原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。