携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情
1.函数模板概念
定义:
函数模板不是一个实在的函数,编译器不能为其生成可执行代码。定义函数模板后只是一个对函数功能框架的描述,当它具体执行时,将根据传递的实际参数决定其功能。 格式:template <class 类型参数1,class 类型参数2,…>
2.函数模板的描述
- 函数模板的声明在关键字template后跟随一个或者多个模板在尖括号内的参数和原型。与普通函数相对,它通常是在一个转换单元里面声明,而在另一个单元中定义,你可以在某个头文件中定义模板class 和 typename
- 在这里,class和typename是相同的。也就是说,在声明一个template type parameter(模板类型参数)的时候,class和typename意味着完全相同的东西。
- template与template一般情况下这两个通用,但有一个特例,就是当H是一个类,而这个类又有子类(假设名为 innerClass) 时,应该用 template
3.函数模板定义一般形式如下:
template<类型形式参数> 函数返回类型 函数名(形式参数表) { …//函数体 }
4.自动类型推导,必须推导出一致的数据类型H,才可以使用
- 利用模板提供通用的交换函数
template<typename H>
void maxint(H &a, H &b)
{
if (b > a)
{
a = b;
}
}
4.1错误的推导不出一致的T类型
template<typename H>
void maxint(H &a, H &b)
{
if (b > a) {
a = b;
}
}
void h()
{
double a;
char c;
c = 'c';
a = 1.2;
maxint(a, c);
cout << "最大值是: " << a << endl;
}
4.2 正确的可以推导出一致的H
void h()
{
double a;
double b;
// c = 'c';
a = 1.2;
b = 1.3;
maxint(a, b);
cout << "最大值是: " << a << endl;
}
输出:
最大值是: 1.3 请按任意键继续. . .
5.模板必须要确定出H的数据类型,才可以使用
5.1 错误的模板不能独立使用,必须确定出H的类
{
cout << "小侯也太可爱了!" << endl;
}
void h()
{
H();
}
int main() {
h();
system("pause");
return 0;
}
5.2 利用显示指定类型的方式,给H一个类型,才可以使用该模板
void L()
{
cout << "小侯也太可爱了!" << endl;
}
void h()
{
L<int>();
}
int main() {
h();
system("pause");
return 0;
}
输出:
小侯也太可爱了! 请按任意键继续. . .
结论:
使用模板时必须确定出通用数据类型T,并且能够推导出一致的类型