C++学习笔记——对仿函数的理解

news/2024/10/21 23:18:36/

文章目录

  • 思维导图
    • 仿函数出现的逻辑
    • 仿函数使用上的巧妙
  • 仿函数的本质
  • 仿函数的优势
  • 仿函数语法的巧妙

思维导图

在这里插入图片描述

仿函数出现的逻辑

我们在学习stack时会遇到一些新的问题,这些问题需要我们使用非类型模板参数去解决,即我们需要在设计类时需要有一个途径去快捷的修改类内部的逻辑,而此时会出现我们用原有的方法无法修改类内部的逻辑;
因此,这里我们需要涉及到仿函数(类型函数)的概念;

仿函数使用上的巧妙

由模板的出现,结合封装的思想发展而生的一个新的逻辑构建途径,将一个类在实例化后的对象名作为一个函数名看待;在对象名后面使用operator()并加入参数,这种方法可以允许我们对参数数量确定的情况下通过选择传递不同的类型,来实现对参数彼此之间的逻辑关系的控制修改;

仿函数的本质

仿函数其本质还是回调——凭借一个对象去使用它的函数;不过不同点在于,我们这里传输的是函数的类型,另外加一个模板参数类型,将实例化一个对象的步骤交给了仿函数去做;

仿函数的优势

这种方法的优势在于我们可以直接修改传参时传入的类型和模板参数就修改了整个类里面某一逻辑,且这种逻辑是可以被我们以自定义的方法去定义;

仿函数语法的巧妙

从仿函数的与法规则我们也可以从中看出C++的一些语法和编译过程的联系。

追根溯源,是编译过程决定哪些语法可以,哪些不可以。

观察传参,我们可以看数量、类型、种类等信息哪些被传过去了,通过这些关键信息的传递,我们可以去猜测编译过程发生了什么,接收参数的类进行自身内部的所有行为都是基于它接收到的信息,当我们在设计传参时发现错错误,一般都是类里面需要某种信息,而我们没有传递给它;
例如:
非类型模板参数必须要传递常量,以便其编译;

在实践中,我们可以发现必须要常量才能使仿函数实例化,因为实例化一个对象我们需要类的类型和模板参数类型,我们在传递类型时没有把模板参数类型传过去,这意味着当编译开始时,编译没有办法完成自己的任务,编译的任务是提前把需要使用的逻辑通路准备号好,而当我们没有传递模板参数类型时,一些类型本身就需要模板参数类型才完整,不给就无法去确定类型的一些变量的数据类型,所以就无法编译这些变量、进而无法编译一些函数,最后编译的内容由有一堆未知的东西;


http://www.ppmy.cn/news/1455082.html

相关文章

HTML_CSS学习:背景、鼠标相关属性

一、背景相关属性 相关代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>背景相关属性</title><style>body{background-color: greenyellow;}div{width: 400px;height: …

什么是PXE

文章目录 在局域网内搭建PXE服务器PXE 启动组件PXE的优点实验一、搭建PXE服务器&#xff0c;实现远程部署CentOS系统环境准备server关闭防火墙安装组件准备 Linux 内核、初始化镜像文件及PXE引导文件配置启用TFTP 服务配置启动DHCP服务准备CentOS 7 安装源配置启动菜单文件 Cli…

场景文本检测识别学习 day09(Swin Transformer论文精读)

Patch & Window 在Swin Transformer中&#xff0c;不同层级的窗口内部的补丁数量是固定的&#xff0c;补丁内部的像素数量也是固定的&#xff0c;如上图的红色框就是不同的窗口&#xff08;Window&#xff09;&#xff0c;窗口内部的灰色框就是补丁&#xff08;Patch&#…

怎么把静图变成gif?推荐一招在线制作

想要实现图片转换gif动图的操作使用什么工具能实现呢&#xff1f;在这个高速发展的时代经常需要在网络中分享、保存各种各样的gif动图。当我们想要将一些静态图片变成有趣的gif图片时&#xff0c;就可以使用gif在线制作&#xff08;https://www.gif.cn/&#xff09;工具&#x…

未来科技的前沿:深入探讨人工智能的进展、机器学习技术和未来趋势

文章目录 一、人工智能的定义和概述1. 人工智能的基本概念2. 人工智能的发展历史 二、技术深入&#xff1a;机器学习、深度学习和神经网络1. 机器学习2. 深度学习3. 神经网络 三、人工智能的主要目标和功能1. 自动化和效率提升2. 决策支持和风险管理3. 个性化服务和预测未来 本…

[Flutter]创建一个私有包并使用

在Flutter中创建一个自己的私有组件&#xff08;通常称为包或库&#xff09;&#xff0c;并通过Dart的包管理工具pub进行使用。 一、创建一个新的Flutter包 1.使用命令行创建 使用Flutter命令行工具来创建一个新的包&#xff1a; $ flutter create --templatepackage my_pri…

【一刷《剑指Offer》】面试题 14:调整数组顺序使奇数位于偶数前面

力扣对应题目链接&#xff1a;LCR 139. 训练计划 I - 力扣&#xff08;LeetCode&#xff09; 牛客对应题目链接&#xff1a;调整数组顺序使奇数位于偶数前面(二)_牛客题霸_牛客网 (nowcoder.com) 核心考点&#xff1a;数组操作&#xff0c;排序思想的扩展使用。 一、《剑指Off…

SolidUtil : Modify功能记录

API功能大纲&#xff1a; namespace Bentley.DgnPlatformNET {public class Modify : SolidUtil{public Modify();public static BentleyStatus BlendEdges(ref SolidKernelEntity target, SubEntity[] edgesIn, double[] radiiIn, int nEdgesIn, bool propagateSmoothIn);pub…