当前位置: 首页 > news >正文

C++ 中的可调用对象

目录

一.可调用对象简介

1.什么是可调用对象?

2.可调用对象有什么用?

二.函数指针和仿函数

1.函数指针

a.函数指针的使用语法

b.函数指针的应用场景

2.仿函数

a.仿函数的基本概念

b.仿函数的优点

三.lambda表达式和function

1.lambda表达式

a.基本语法格式

b.lambda表达式的实战实例

2.function

a.使用方法

b.应用场景和注意事项


一.可调用对象简介

1.什么是可调用对象?

可调用对象指的是任何可以像函数那样被调用的实体。这些实体包括普通函数、仿函数对象(即重载了 operator() 的类对象或结构体对象)、函数指针、lambda表达式、以及C++11引入的std::function包装器。

简单来说,可调用对象是一个实体,我们可以对它传递参数,像调用函数一样去调用它。

2.可调用对象有什么用?

以std::sort()排序函数为例,它用于对元素进行排序,通常接受两个或三个参数。前两个参数指定了要排序的范围(通常是容器中的一段),而第三个参数(可选的)是一个比较函数或比较函数对象,用于明确元素排序的规则(如按元素大小排序、按元素字典序排序...等)。

再以std::priority_queue() 容器适配器为例,它提供了一个基于优先级的队列,通常用于管理需要按照优先级顺序处理的元素集合。std::priority_queue() 的构造函数允许你指定其底层容器的类型(虽然这通常是隐式的,默认为 std::vector)、元素的类型以及一个可选的比较函数或函数对象,用于确定元素的优先级。

小结,可调用对象可以:

①作为参数传递(如上述的sort()的第三个参数);

②在标准库中的使用(如上述的优先级队列);

③做回调函数(即在某个事件发生时由系统或其他代码调用的函数);

④自定义比较和排序;

......等。

简单说完了什么是可调用对象,和可调用对象的用途后,咱们来正式了解可调用对象的具体形式吧,它包括函数指针(C语言里的那套)、仿函数、lambda表达式和包装器。咱们来一一认识~~

二.函数指针和仿函数

1.函数指针

函数指针是指向函数的指针变量,它允许我们将函数作为参数传递给其他函数,或者将函数地址存储在变量或容器中以供后续调用。

a.函数指针的使用语法

注意函数指针的声明格式:返回值类型 (*指针名) (函数参数类型)

通过函数指针调用函数?俺直接用函数名调用函数不行吗?为啥要再通过一个指针?是不是感觉有中脱裤子放P的感觉?

暧,上面那个例子只是为了将函数指针的使用规则,但函数指针真正的应用场景肯定不是这样的。

b.函数指针的应用场景

①函数指针作为参数

②函数指针做回调函数

函数指针有多种用途,比如实现回调函数、在数据结构中存储函数以进行自定义操作等。

2.仿函数

a.仿函数的基本概念

仿函数指的是那些重载了 operator() 的对象或类实例,从而使得这些对象或实例可以像函数一样被调用。

例一:

例二:

仿函数对象可以做实参做sort的第三个参数(上述可调用对象简介中有过演示)来指定排序规则,仿函数也可做类型在优先级队列中明确元素的排序规则。

仿函数的核心在于其重载的 operator() 方法,这个方法定义了当仿函数被“调用”时应该执行的操作。由于仿函数实际上是对象,因此它们可以包含状态(即成员变量),这使得它们比传统的函数指针更强大,因为函数指针无法直接携带状态信息。

b.仿函数的优点

①仿函数可以包含并维护自己的状态,这是函数指针所无法做到的。

②与函数指针相比,仿函数提供了更好的类型安全性,因为它们的参数和返回类型在编译时就被确定了。

③由于仿函数的本质是一个类对象,所以仿函数可以通过继承来扩展功能,这是函数指针所不具备的。

④在某些情况下,使用仿函数可以使代码更加清晰和易于理解,特别是当可调用对象的行为与其数据紧密相关时。

三.lambda表达式和function

Lambda表达式允许我们在代码中定义和使用内联的、匿名的函数对象,它们非常适合用于需要小函数的地方。

1.lambda表达式

a.基本语法格式

语法格式:[捕捉列表](参数列表)mutable -> 返回类型 {函数实体};

如:auto less = [ ] (int x, int y) -> bool { return x>y; };   

调用方式:cout << less(1 , 2) <<endl;

捕获列表

[=]:表示以传值的方式捕获所有父作用域中变量和函数(包括tihs);

[&]:表示以传引用的方式捕获所有父作用域中变量和函数(包括this);

例如:[x, &y] 表示捕获x为值,y为引用; 或[=, &z] 表示捕获所有外部变量为值,但z为引用;或 [&, x]  表示捕获所有外部变量为引用,但x为值。

[ ] 空捕获,表示不捕获任何变量或函数。

lambda的捕捉列表可以捕捉到外界的对象,相当于是外界对象的一份拷贝,但其默认被const修饰,如auto swap = [x , y] () { int tmp=x; x=y; y=tmp; }; ×

mutable

而若想改变捕捉的对象,则需要使用到mutable,如:auto swap = [x , y] () mutable { int tmp=x; x=y; y=tmp; }; 但此时x和y虽然能在函数定义内改变,但其仍是外界对象的一份拷贝,其值改变不会影响到外界的对象。

除非是外界对象的引用,如:auto swap = [&x , &y] () { int tmp=x; x=y; y=tmp; };  

参数列表

int x, int y)相当于函数形参,是我们调用该可调用对象时传入的参数;

-> 是固定的语法个数,但可以省略;bool 相当于函数的返回值类型,由于其具体类型可以通过函数实体推导,故该类型也可以省略;

{ return x>y; } 相当于函数实体,是可调用对象需要执行的具体功能。

注意:范围for的底层是迭代器,而lambda的底层是仿函数!!

lambda对象类型

一个lambda语句对应一个实现有仿函数的类,对个lambda对应的类名都不同,类名的生成使用了UUID做后缀,保证类名不会重复!

auto 是可调用对象的类型,它是唯一的、未命名的类型,这种类型是由编译器根据lambda表达式的捕获列表、参数列表、返回类型以及函数体自动生成的,故只能用auto来自动推导(或function包装器)。

b.lambda表达式的实战实例

示例一(捕获父作用域中的局部变量、全局变量和函数体):

示例二(捕获父作用域中的类对象):

2.function

std::function 是一个功能强大的模板类,它提供了一种通用的、类型安全的方式来存储和调用任何可调用对象,包括普通函数、Lambda表达式、仿函数对象以及成员函数指针。

a.使用方法

定义一个 std::function 实例时,需要指定可调用对象的返回类型和参数类型

function对各类可调用对象的封装:

b.应用场景和注意事项

应用场景

①回调函数:在需要传递回调函数作为参数的场合,function 可以提供一种灵活且类型安全的方式。

②事件处理:在基于事件驱动的应用程序中,function 可以用于注册事件处理器。

注意事项

空 function :未初始化的 function 是空的,调用它会抛出 std::bad_function_call 异常。

多线程:function 本身不是线程安全的,但如果它所存储的可调用对象是线程安全的,那么可以在多个线程中安全地调用它。

性能:虽然 function 提供了很大的灵活性,但它通常比直接调用函数或Lambda表达式要慢一些,因为它涉及到额外的间接调用和类型擦除。

相关文章:

C++ 中的可调用对象

目录 一.可调用对象简介 1.什么是可调用对象&#xff1f; 2.可调用对象有什么用&#xff1f; 二.函数指针和仿函数 1.函数指针 a.函数指针的使用语法 b.函数指针的应用场景 2.仿函数 a.仿函数的基本概念 b.仿函数的优点 三.lambda表达式和function 1.lambda表达式 …...

[HBase]二 HBase原生Shell命令大全

HBase原生Shell命令汇总 1. General组 5 1.1. 查看集群状态:status 5 1.2. 查看表的操作方法:table_help 5 1.3. 查看HBase的版本信息:version 5 1.4. 查看当前用户:whoami 5 2. Namespace组 5 2.1. 创建命名空间:create_namespace 5 2.2. 显示命名空…...

Kafka之消费者客户端

1、历史上的二个版本 与生产者客户端一样&#xff0c;在Kafka的发展过程当中&#xff0c;消费者客户端主要有两个大的版本&#xff1a; 旧消费者客户端&#xff08;Old Consumer&#xff09;&#xff1a;基于Scala语言开发的版本&#xff0c;又称为Scala消费者客户端。新消费…...

使用Python进行数据分析入门

文章目录 Python环境搭建安装Anaconda验证安装 必备库介绍NumPyPandasMatplotlibSciPy 数据导入与清洗导入数据清洗数据 数据探索与分析描述性统计相关性分析 数据可视化绘制直方图 高级主题机器学习深度学习 总结 随着大数据时代的到来&#xff0c;数据分析变得越来越重要。Py…...

ubuntu20 从源码编译升级到版本5.15.263

author: hjjdebug date: 2024年 10月 25日 星期五 15:38:48 CST description: ubuntu20 从源码编译升级到版本5.15.263 我的内核是 5.15.105, 用apt 下载源码后其版本是5.15.263 为什么要从源码编译内核. 升级内核? 目的: 练练手. 消除内核神秘性. 还可以裁减内核,也是调试内核…...

php 程序开发分层与验证思想

在PHP程序开发中&#xff0c;合理的层级设计可以提高代码的可维护性、可扩展性和可测试性。以下是常见的层级设计模式及建议&#xff1a; 1. 分层架构 通常可以将PHP应用分为以下几层&#xff1a; 表示层&#xff08;Presentation Layer&#xff09;&#xff1a; 负责与用户交…...

关于InternVL2的单卡、多卡推理

关于InternVL2的单卡、多卡推理 前言单卡推理多卡推理总结前言 本章节将介绍如何使用上一章节微调后的模型进行推理。推理又分为单卡和多卡,这里介绍的两种方式都是Hugging Face的transformers方法进行推理。模型的话可以使用上一章微调的任意一个非lora模型进行测试。 单卡推…...

Go语言设计Web框架

如何设计一个Web框架 项目规划 在开始设计Web框架之前&#xff0c;我们需要对整个项目进行规划。主要包括以下几个方面&#xff1a; 项目结构依赖管理路由设计控制器设计日志和配置管理 项目结构 首先&#xff0c;我们定义项目的目录结构&#xff1a; ├── cmd/ │ └…...

2024年10月28日练习(双指针算法)

一.11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 1.题目描述&#xff1a; 这个题目代表的意思就是数组上每个对应的值就相当于每条垂直线的高度&#xff0c;就相当于短板效应&#xff0c;两 个高度的线会取最短的长度因为那样水才不会漏。而两条线的数组的下标…...

Objective-C 音频爬虫:实时接收数据的 didReceiveData_ 方法

在互联网技术领域&#xff0c;数据的获取和处理是至关重要的。尤其是对于音频内容的获取&#xff0c;实时性和效率是衡量一个爬虫性能的重要指标。本文将深入探讨在Objective-C中实现音频爬虫时&#xff0c;如何高效地使用didReceiveData:方法来实时接收数据&#xff0c;并通过…...

提升网站流量和自然排名的SEO基本知识与策略分析

内容概要 在当今数字化时代&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;成为加强网站可见度和提升流量的重要工具。SEO的基础知识包括理解搜索引擎的工作原理&#xff0c;以及如何通过优化网站内容和结构来提高自然排名。白帽SEO和黑帽SEO代表了两种截然不同的策略&a…...

雷池社区版compose文件配置讲解--fvm

在现代网络安全中&#xff0c;选择合适的 Web 应用防火墙至关重要。雷池&#xff08;SafeLine&#xff09;社区版免费切好用。为网站提供全面的保护&#xff0c;帮助网站抵御各种网络攻击。 docker-compose.yml 文件是 Docker Compose 的核心文件&#xff0c;用于定义和管理多…...

基于51单片机的智能断路器proteus仿真

地址&#xff1a; https://pan.baidu.com/s/16lfGgrgVr9V7JehonMNVQA 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectro…...

(N-154)基于springboot酒店预订管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 前端技术&#xff1a;AdminLTEBootstrapLayUIHTMLjQuery 服务端技术&#xff1a;springbootmybatis-plusthymeleaf 本项目分前台和后台…...

elasticsearch 8.x 插件安装(三)之拼音插件

elasticsearch 8.x 插件安装&#xff08;三&#xff09;之拼音插件 elasticsearch插件安装合集 elasticsearch插件安装&#xff08;一&#xff09;之ik分词器安装&#xff08;含MySQL更新&#xff09; elasticsearch 8.x插件&#xff08;二&#xff09;之同义词安装如何解决…...

快速遍历包含合并单元格的Word表格

Word中的合并表格如下&#xff0c;现在需要根据子类&#xff08;例如&#xff1a;果汁&#xff09;查找对应的品类&#xff0c;如果这是Excel表格&#xff0c;那么即使包含合并单元格&#xff0c;也很容易处理&#xff0c;但是使用Word VBA进行查找&#xff0c;就需要一些技巧。…...

手机收银云进销存管理软件,商品档案Excel格式批量导入导出,一键导入Excel的商品档案

如果您有Excel的商品档案&#xff0c;那么就可以批量导入到我们的手机云进销存软件系统里&#xff0c;就不需要人工手工一个个商品的新建商品档案&#xff0c;大大提高工作效率。如果您看下面的步骤不会操作&#xff0c;可以联系我们技术支持&#xff0c;来帮您把商品档案导入。…...

html 中识别\n自动换行

CSS实现&#xff1a;white-space <div style"white-space: pre-wrap;" v-html"str"> </div>white-space: normal|nowrap|pre|pre-line|pre-wrap|initial|inherit;值描述换行符空格和制表符文字换行行尾空格normal默认。空白会被浏览器忽略。合…...

用QWebSocketServer写websocket服务端

1. 引入必要的头文件 #include <QCoreApplication> #include <QWebSocketServer> #include <QWebSocket> #include <QDebug> #include <QObject>QCoreApplication&#xff1a;用于创建控制台应用的事件循环。QWebSocketServer&#xff1a;提供 …...

云原生后端:现代应用架构的核心力量

云原生后端&#xff1a;现代应用架构的核心力量 云原生后端是基于云环境进行设计和开发的一种理念&#xff0c;利用云服务和云原生技术构建的服务端应用。它旨在提供灵活、高效、弹性和可扩展的解决方案&#xff0c;成为推动应用现代化的核心力量。本文将详细探讨云原生后端的…...

arcgis中dem转模型导入3dmax

文末分享素材 效果 1、准备数据 (1)DEM (2)DOM 2、打开arcscene软件 3、加载DEM、DOM数据 4、设置DOM的高度为DEM...

Python自动化测试中的Mock与单元测试实战

在软件开发过程中&#xff0c;自动化测试是确保代码质量和稳定性的关键一环。而Python作为一门灵活且强大的编程语言&#xff0c;提供了丰富的工具和库来支持自动化测试。本文将深入探讨如何结合Mock与单元测试&#xff0c;利用Python进行自动化测试&#xff0c;以提高代码的可…...

物联网海量数据下的时序数据库选型:InfluxDB、TDEngine、MongoDB与HBase对比与建议

随着物联网&#xff08;IoT&#xff09;的普及&#xff0c;各行业纷纷部署大量传感器、设备生成的数据流&#xff0c;面对如此海量的时间序列数据&#xff0c;如何高效存储、查询和分析成为关键。为此&#xff0c;时序数据库&#xff08;Time Series Database, TSDB&#xff09…...

Python中的数据可视化:Matplotlib基础与高级技巧

Python中的数据可视化&#xff1a;Matplotlib基础与高级技巧 数据可视化是数据分析和数据科学中不可或缺的一部分。通过图表&#xff0c;我们可以更直观地观察数据的分布和趋势。Matplotlib作为Python最基础、也是最广泛使用的绘图库之一&#xff0c;不仅支持多种常用图表&…...

数组名和指针数组名深度复习

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> //sizeof只关注占用内存空间的大小&#xff0c;不在乎内存中存放的是什么 //是操作符 /* int main() { char arr[] { "abcdef" }; //a b c d e f \0 printf("%d\n", sizeof(arr));//…...

Linux 诞生

目录 Linux诞生背景 Linus Torvalds的创举 Linux内核的首次发布 Linux诞生背景 在计算机操作系统的发展史上&#xff0c;Linux是一个重要的里程碑。它的诞生源于对自由、开放和协作精神的追求&#xff0c;以及对Unix操作系统的深入研究和改进。 在1991年之前&#xff0c;Un…...

借助Aspose.Email,管理受密码保护的 PST 文件

在当今的数字环境中&#xff0c;保护您的数据比以往任何时候都更加重要。确保您的电子邮件数据受到密码保护是维护安全性的关键步骤。对于使用 Microsoft Outlook 数据的开发人员来说&#xff0c;管理受密码保护的 PST&#xff08;个人存储表&#xff09;文件可能是一项关键任务…...

MySQL数据库MHA高可用

目录 一、MHA简述 二、MHA 的组成 三、MHA 的特点 四、MHA工作原理 五、MHA部署步骤 六、搭建 MySQL MHA MHA一主两从高可用集群示意图 实验环境 1. Master、Slave1、Slave2 节点上安装 mysql5.7 2. 关闭防火墙 3. 修改 Master、Slave1、Slave2 节点的主机名 4. 修…...

DevEco Studio使用技巧和插件推荐

DevEco Studio是一款强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;为开发者提供了丰富的功能和插件。以下是一些使用技巧和插件推荐&#xff1a; 使用技巧 设置中文界面&#xff1a; 打开DevEco Studio&#xff0c;选择“Configure”&#xff0c;再点击“Prefer…...

使用Node.js与Express构建RESTful API

&#x1f496; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4bb; Gitee主页&#xff1a;瑕疵的gitee主页 &#x1f680; 文章专栏&#xff1a;《热点资讯》 使用Node.js与Express构建RESTful API 1 引言 2 Node.js与Express简介 3 安装Node.js与Express 4 创建Express项目 5…...

wordpress 在线qq客服/2023今天的新闻联播

5.3.5.4 Configmap Why:配置信息和镜像解耦What:将配置信息放到configmap对象中,然后在pod的对象中导入configmap对象,实现导入配置的操作How:声明一个ConfigMap的对象,作为Volume挂载到pod中配置变更: 直接把服务的配置文件(nginx.conf)放到镜像里configmap,把配置和…...

东莞 营销网站制作/百度网页版浏览器

1.下载eclipse需要的运行环境&#xff0c;JDK/JRE. 在http://wiki.eclipse.org/Eclipse/Installation中&#xff0c;找到最新的eclipse版本需要的JAVA 版本&#xff0c;然后去相应网站下载JAVA。这里我用的是Eclipse 4.5(Mars)&#xff0c;它需要JAVA 7。 2.下载eclipse 在ecli…...

php做的网站好么/河南网站优化

题意&#xff1a;给你 n个点 m条边 每条边有些公司支持 问 a点到b点的路径有哪些公司可以支持 这里是一条路径中要每段路上都要有该公司支持 才算合格的一个公司 分析&#xff1a;map[i][j] 等于 i直接到 j 的 公司数,加上i经过中间节点到 j 的 公司数 因为每两个站点间的…...

网站设置手机版/免费网络推广渠道

直接上代码&#xff1a; IF(A1"N","0",IF(A1"Y",E$1)) 解释&#xff1a;先处理内层&#xff0c;如果A1"Y"的话&#xff0c;则当前单元格等于E1的值。 当此内层循环不满足时&#xff0c;跳出此循环&#xff0c;直接到外面的循环&#x…...

温岭建设规划局网站/网站产品怎么优化

下面是禁止移动端滑动事件的方式&#xff0c;慎用 document.querySelector(body).addEventListener(touchmove, function (ev) {event.preventDefault();});转载于:https://www.cnblogs.com/songdongdong/p/6739701.html...

网站注册实名制怎么做/seo快速排名服务

不要自卑&#xff0c;去提升实力 互联网行业谁技术牛谁是爹 如果文章可以带给你能量&#xff0c;那是最好的事&#xff01;请相信自己 加油o~ 点击下面链接 蓝桥杯历届真题题目解析代码答案&#xff08;2013-2020&#xff09;&#xff08;JavaA、B、C组&#xff09; 题目描述…...