C++之std::function类模板定义函数对象应用总结(二百三十八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解C++之std::function类模板定义函数对象用法。

2.std::function类模板定义函数对象介绍

函数对象概念:
  • 函数指针被广泛用于实现函数回调,但C++还提供了一个重要的实现回调函数的方法,那就是std::function定义的函数对象。函数对象(也称“函数符”)是重载了“()”操作符的普通类对象。从语法上讲,函数对象与普通的函数行为类似。

  • std::function是一组函数对象包装类的模板,实现了一个泛型的回调机制。function与函数指针比较相似,它既可以是普通函数,也可以是函数对象和类的成员函数。

  • C++中的functional库提供了一种通用的方式来接收任意可调用对象,包括函数指针、函数对象、Lambda表达式等

  • 函数对象是指能像函数一样被调用的对象。

  • functional头文件中提供了几个常用的函数对象,如std::functionstd::bindstd::placeholder等。

  • std::function是一个通用的函数封装器,类似于函数指针,可以用来包装任意可调用的目标,如普通函数、函数指针、成员函数、lambda表达式等。通过std::function,我们可以将函数对象作为一个参数传递给其他函数或者保存它们在容器中。

  • std::bind是一个用于创建函数对象的工具函数,它可以将一个可调用对象和其参数绑定在一起,生成一个新的函数对象。这样,我们可以在调用这个新的函数对象时,只需提供未绑定的参数,而不需要再传递所有的参数。

  • std::placeholder是一个占位符,用于表示绑定参数的位置。在使用std::bind函数时,我们可以使用std::placeholder来指定不同位置上的参数。

3.std::function类模板实例

<1>. 使用函数指针:

#include <iostream>
#include <functional>void foo() {std::cout << "Hello, world!\n";
}int main() {std::function<void()> func = &foo;  // 使用函数指针初始化std::function对象func();  // 调用函数指针所指向的函数return 0;
}

<2>. 使用函数对象:

#include <iostream>
#include <functional>struct Foo {void operator()() {std::cout << "Hello, world!\n";}
};int main() {std::function<void()> func = Foo();  // 使用函数对象初始化std::function对象func();  // 调用函数对象的operator()函数return 0;
}

<3>. 使用Lambda表达式:

#include <iostream>
#include <functional>int main() {std::function<void()> func = []() {  // 使用Lambda表达式初始化std::function对象std::cout << "Hello, world!\n";};func();  // 调用Lambda表达式代表的函数return 0;
}

<4>. 使用成员函数:

#include <iostream>
#include <functional>struct Foo {void bar() {std::cout << "Hello, world!\n";}
};int main() {Foo foo;std::function<void()> func = std::bind(&Foo::bar, &foo);  // 使用std::bind绑定成员函数和对象func();  // 调用绑定的成员函数return 0;
}

<5>. 使用成员函数和成员变量:

#include <iostream>
#include <functional>struct Foo {int value;void bar() {std::cout << "Value: " << value << "\n";}
};int main() {Foo foo;foo.value = 42;std::function<void()> func = std::bind(&Foo::bar, &foo);  // 使用std::bind绑定成员函数和对象func();  // 调用绑定的成员函数return 0;
}

<6>. 使用函数对象和参数:

#include <iostream>
#include <functional>struct Add {int operator()(int a, int b) {return a + b;}
};int main() {std::function<int(int, int)> func = Add();  // 使用函数对象初始化std::function对象,并指定参数和返回值类型int result = func(2, 3);  // 调用函数对象重载的()运算符std::cout << "Result: " << result << "\n";return 0;
}

<7>. 使用Lambda表达式和参数:

#include <iostream>
#include <functional>int main() {std::function<int(int, int)> func = [](int a, int b) {  // 使用Lambda表达式初始化std::function对象,并指定参数和返回值类型return a + b;};int result = func(2, 3);  // 调用Lambda表达式代表的函数std::cout << "Result: " << result << "\n";return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/142105.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

python的讲解和总结V2.0

python的讲解和总结V2.0 一、Python的历史二、Python的特点三、Python的语法四、Python的应用领域五、Python的优缺点优点a. 简单易学&#xff1a;b. 可读性强&#xff1a;c. 库和框架丰富&#xff1a;d. 可移植性强&#xff1a;e. 开源&#xff1a; 缺点a. 运行速度较慢&#…

高速USB转8路RS422串口

基于480Mbps 高速USB转8路串口芯片CH348&#xff0c;可以为各类主机扩展出8个独立的串口。使用厂商提供的VCP串口驱动程序&#xff0c;可支持Windows、Linux、Android、macOS等操作系统。使用单个CH348芯片即可实现USB一拖八串口转接产品&#xff0c;高速USB收发器和控制器、高…

vue做无缝滚动

类似于这种&#xff1a; 以上截图来自于官网&#xff1a;vue-seamless-scroll 具体使用步骤为&#xff1a; 1:安装 cnpm install vue-seamless-scroll --save  2&#xff1a;引入 <vue-seamless-scroll></vue-seamless-scroll>import vueSeamlessScroll from …

最熟悉的陌生人!Java运算符详解

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、算术运算符1、四则运算符2、增量运算符3、自增、自减运算符 二、关系运算符三、关系运算符1、逻辑与 &&2、逻辑或|…

Android.bp常用语法和预定义属性

介绍 Android.bp是Android构建系统中用于定义模块和构建规则的配置文件&#xff0c;它使用一种简单的声明式语法。以下是Android.bp的一些常见语法规则和约定&#xff1a; 注释&#xff1a; 单行注释使用//符号。 多行注释使用/和/包围。 和go语言相同 // 这是单行注释 /* 这是…

jenkins自动化部署springboot、gitee项目

服务器需要安装jdk11、maven、gitee 1. jenkins安装 # yum源 sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo # 公钥 sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io-2023.key # 安装 yum install jenkins如果yum源报…

Redis入门 (店铺营业状态设置) --苍穹外卖day4

目录 redis简介 redis下载与安装 redis服务启动与停止​编辑 redis数据类型 五种常用数据类型 各个类型特点 redis常用命令 字符串 哈希 列表 集合 有序集合 通用指令 ​在Java中操作Redis 导入坐标 编写配置类​ 通过RedisTem~对象操作 字符串 ​哈希 列…

uni-app:实现密码框内容展示与隐藏

效果 代码 <template><view class"container"><view class"item_left"><view>密码</view><view class"eye_position" taptoggleShowPassword><image :srceye v-ifisShowPassword /><image :srcey…

20-SpringCloudAlibaba-1

一 Spring Cloud Alibaba简介 什么是Spring Cloud Alibaba Spring Cloud Alibaba致力于提供微服务开发的一站式解决方案。 此项目包含开发分布式应用微服务的必需组件&#xff0c;方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。 为什么要推出Sp…

深入理解Elasticsearch中的Match Phrase查询

文章目录 摘要Match Phrase查询的原理Match Phrase查询的用法Match Phrase查询的示例代码 Match Phrase查询的注意事项总结 摘要 Elasticsearch是一个功能强大的开源搜索引擎&#xff0c;它提供了丰富的查询功能。其中&#xff0c;Match Phrase查询是一种强大的查询类型&#…

STM32存储左右互搏 I2C总线读写FRAM MB85RC1M

STM32存储左右互搏 I2C总线读写FRAM MB85RC1M 在较低容量存储领域&#xff0c;除了EEPROM的使用&#xff0c;还有铁电存储器FRAM的使用&#xff0c;相对于EEPROM, 同样是非易失性存储单元&#xff0c;FRAM支持更高的访问速度&#xff0c; 其主要优点为没有EEPROM持续写操作跨页…

iOS应用程序的签名、重签名和安装测试

目录 前言 打开要处理的IPA文件 设置签名使用的证书和描述文件 开始ios ipa重签名 前言 ipa编译出来后&#xff0c;或者ipa进行修改后&#xff0c;需要进行重新签名才能安装到测试手机&#xff0c;或者提交app store供apple 商店审核上架。ipaguard有签名和重签名功能&…

Mysql索引结构有哪些

1、BTree索引 1、初始化介绍 一颗b树&#xff0c;浅蓝色的块我们称之为一个磁盘块&#xff0c;可以看到每个磁盘块包含几个数据项&#xff08;深蓝色所示&#xff09;和指针&#xff08;黄色所示&#xff09;&#xff0c;如磁盘块1包含数据项17和35&#xff0c;包含指针P1、P2…

uni-app使用HBuilder X编辑器本地打包apk步骤说明

1.下载安装Android Studio 下载地址官方地址&#xff1a;Android Studio 下载文件归档 | Android 开发者 | Android Developers 安装Android SDK和Google USB Driver即可&#xff0c;后者主要是为了后期使用USB设置的&#xff0c;如果不需要可以不点。 2.下载uni-app提供…

2023年前端流行什么技术和框架了?

Web前端三大主流框架有React、Vue.js和Angular&#xff0c;由于接触过Vue.js&#xff0c;接下来主讲最新的Vue3.0&#xff01; Vue3.0作为最新版本的Vue.js框架&#xff0c;拥有更强大的性能和更丰富的功能&#xff0c;为低代码开发平台注入了全新的活力。而JNPF快速开发平台作…

即刻报名!飞桨黑客马拉松第五期开启,创新挑战等你来!

新赛制&#xff0c;新玩法 飞桨黑客马拉松第五期 全新挑战&#xff0c;重磅回归&#xff01; 开源贡献个人挑战赛、大模型应用与创意赛、飞桨护航计划集训营 三大赛道&#xff0c;邀你挑战&#xff01; 多难度梯度开源任务、大模型应用创意挑战、导师1V1指导开发实践 硬核较量一…

ajax method to retrieve images as a blob

go 服务端&#xff1a; 就是先把这个图片读出来 然后返回二进制的数据 byteFile, err : ioutil.ReadFile("." "/processed/" uuidStr"processed.png")if err ! nil {fmt.Println(err)}c.Header("Content-Disposition", "att…

PWN环境搭建

虚拟机Ubuntu安装 工具&#xff1a;Vmware 16 以及 Ubuntu 18或20 来源&#xff1a;清华大学开源软件镜像站 | Tsinghua Open Source Mirror 虚拟机安装流程 安装很简单&#xff0c;按照提示一步步来即可 处理器可以多给一些&#xff0c;我给了8个&#xff0c;内核数量不…

智慧公厕,公共厕所数字化促进智慧城市管理的成效

随着科技的不断进步和城市化的快速发展&#xff0c;城市管理也面临着新的挑战和机遇。而智慧公厕作为基层配套设施&#xff0c;通过数字化提升城市管理的效能&#xff0c;成为了现代智慧城市建设的重要一环。本文以智慧公厕领先厂家广州中期科技有限公司&#xff0c;大量项目案…

SAP Service服务重注册技术手册

当SAP服务被卸载后,或SAP虚拟机整机copy后(可能还需要涉及主机名更改),需要对SAP服务重注册。 在路径 \sapmnt\<SID>\ DVEBMGS00\exe下使用程序sapstartsrv.exe来卸载、安装SAP服务: 其中<SID>、NR参考Service中需要卸载的服务名(卸载后,Services列表中的SA…