一.引入:查看(容器)文档时常常遇到的场景
- 我们在
https://cplusplus.com/reference/forward_list/forward_list/
查看类模板时,常常会看到这些东西,如下图所示的都分别是什么意思呢?- 其实我们在学习函数参数时也知道默认实参,但在类模板中遇到这种往往犯迷糊;我们直接给出结论:
allocator<T>
是一个仿函数默认模板实参
二.默认模板实参详解(含代码演示)
前置知识:
- 仿函数:把一个类用()重载(类中实现一个operator()),让其能够实现函数的功能
- 我们可以举一个例子:我们重写 compare,默认使用标准库的 less 函数对象模板
// compare 有一个默认模板实参less<T>和一个跌认函数实参F0) template <typename T,typename F=less<T>> int compare(const T &vl, const T &v2,F f= F()) { if (f(vl,v2)) return -1;//使用时,用f()————它是一个仿函数, if (f(v2,vl)) return l; return0: }
分析这段代码:
- 我们为此模板参数提供了默认模板实参
less<T>
并为其对应的函数参数也提供了默认实参T
- 默认模板实参指出:compare 将使用标准库的
less 函数对象类(即仿函数)
,它是使用与 compare一的类型参数实例化的- 默认函数实参指出
f
将是类型E的一个默认初始化的对象- 当用户调用这个版本的 compare 时,可以提供自己的比较操作,但这并不是必需的
- 与函数默认实参一样,对于一个模板参数,只有当它右侧的所有参数都有默认实参时,它才可以有默认实参。