携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情
4.1 自动类型推导
template<typename H>
void maxint(H &a, H &b)
{
if (b > a) {
a = b;
}
}
void h()
{
double a, b;
a = 1.2;
b = 1.3;
maxint(a, b);
cout << "最大值是: " << a << endl;
}
输出:
最大值是: 1.3 请按任意键继续. . .
4.2 显示指定类型
void h()
{
double a, b;
a = 1.2;
b = 1.3;
maxint<double>(a, b);
cout << "最大值是: " << a << endl;
}
输出:
最大值是: 1.3 请按任意键继续. . .
总结:
- 函数模板利用关键字 template
- 使用函数模板有两种方式:自动类型推导、显示指定类型
- 模板的目的是为了提高复用性,将类型参数化
拓展:
在 C++ 中,模板分为函数模板和类模板两种。
- 函数模板是用于生成函数:可以用关键字template或者class
- 类模板则是用于生成类的:只能用class
template <class 类型参数1, class类型参数2, ...>
返回值类型 模板名(形参表)
{
函数体
}
其中的 class 关键字也可以用 typename 关键字替换,例如:
template <typename 类型参数1, typename 类型参数2, ...>
5.模板的工作原理
- 模板定义并不是真正的定义了一个函数或者类,而是编译器根据程序员缩写的模板和形参来自己写出一个对应版本的定义,这个过程叫做模板实例化。
- 编译器成成的版本通常被称为模板的实例。编译器为程序员生成对应版本的具体过程。类似宏替换。
- 模板类在没有调用之前是不会生成代码的。
- 由于编译器并不会直接编译模板本身,所以模板的定义通常放在头文件中。
6.非类型模板参数
- 模板参数不是一个类型而是一个具体的值——这个值是常量表达式。
- 当一个模板被实例化时,,非类型参数被一个用户提供的或者编译器推断出的值所代替。正因为模板在编译阶段编译器为我们生成一个对应的版本,所以其值应该能够编译时确定,那么他应该是一个常量或者常量表达式。