1009模板02函数模板的注意事项

190 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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;
}

1661003832259.png

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;
}

1661004211607.png

5.2 利用显示指定类型的方式,给H一个类型,才可以使用该模板

void L()
{
	cout << "小侯也太可爱了!" << endl;
}

void h()
{
	L<int>();
}

int main() {
	h();
	system("pause");
	return 0;
}

输出:

小侯也太可爱了! 请按任意键继续. . .

结论:

使用模板时必须确定出通用数据类型T,并且能够推导出一致的类型