【C++】仿函数在模板中的应用——【默认模板实参】详解(n)

2023-12-16 01:19:26

前言

大家好吖,欢迎来到 YY 滴C++系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁
主要内容含:
在这里插入图片描述

欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!

一.引入:查看(容器)文档时常常遇到的场景

  • 我们在https://cplusplus.com/reference/forward_list/forward_list/查看类模板时,常常会看到这些东西,如下图所示的都分别是什么意思呢?
  • 其实我们在学习函数参数时也知道默认实参,但在类模板中遇到这种往往犯迷糊;我们直接给出结论:allocator<T>是一个仿函数默认模板实参
    在这里插入图片描述
    在这里插入图片描述

二.默认模板实参详解(含代码演示)

前置知识:

  • 仿函数:把一个类用()重载(类中实现一个operator()),让其能够实现函数的功能
  • 我们可以举一个例子:我们重写 compare,默认使用标准库的 less 函数对象模板
// compare 有一个默认模板实参less<T>和一个跌认函数实参F0)
template <typename Ttypename 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:
}

分析这段代码:

  1. 我们为此模板参数提供了默认模板实参less<T>并为其对应的函数参数也提供了默认实参T
  2. 默认模板实参指出:compare 将使用标准库的 less 函数对象类(即仿函数),它是使用与 compare一的类型参数实例化的
  3. 默认函数实参指出f将是类型E的一个默认初始化的对象
  4. 当用户调用这个版本的 compare 时,可以提供自己的比较操作,但这并不是必需的
  5. 与函数默认实参一样,对于一个模板参数,只有当它右侧的所有参数都有默认实参时,它才可以有默认实参。

文章来源:https://blog.csdn.net/YYDsis/article/details/134889444
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。