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.mzph.cn/news/87931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#流Stream与IO详解(4)——如何更快的读写文件

【前言】 在我们追求更快读写速度时&#xff0c;通常都是为了读写二进制文件&#xff0c;而不是文本文件&#xff0c;所以这里只说FileStream、BinaryReader、BinaryWriter的使用。 从前文的源码解读中能看到使用BinaryReader和BinaryWriter进行IO读写时本质还是调用了FileSt…

如何使用canvas实现一个下雪的动效

下面是一个使用Canvas实现下雪动效的代码示例&#xff1a; <!DOCTYPE html> <html> <head><title>下雪特效</title><style>body {margin: 0;padding: 0;}canvas {display: block;background: black;}</style> </head> <bo…

.NET的键盘Hook管理类,用于禁用键盘输入和切换

一、MyHook帮助类 此类需要编写指定屏蔽的按键&#xff0c;灵活性差。 using System; using System.Runtime.InteropServices; using System.Diagnostics; using System.Windows.Forms; using Microsoft.Win32;namespace MyHookClass {/// <summary>/// 类一/// </su…

一文详解JDK8常用10个更新特性

今日一语&#xff1a;当你发现编程的规律就是世界的规律时&#xff0c;你就是一名真正的程序员 1 Lambda(蓝布达)表达式 编译后会产生一个$XXXImpl1的编译文件&#xff0c;与匿名内部类相似&#xff0c;但不等同于匿名内部类。 其原理是将方法作为参数进行传递&#xff0c; JV…

【深入浅出设计模式--命令模式】

深入浅出设计模式--命令模式 一、背景二、问题三、解决方案四、试用场景总结五、后记 一、背景 命令模式是一种行为设计模式&#xff0c;它可以将用户的命令请求转化为一个包含有相关参数信息的对象&#xff0c;命令的发送者不需要知道接收者是如何处理这条命令&#xff0c;多个…

php文件上传功能(文件上传)

实现文件上传是Web开发中常用的功能之一&#xff0c;而PHP也是支持文件上传的。那么&#xff0c;下面我们就来介绍一下常用的PHP实现文件上传的方法。 使用HTML表单实现文件上传 HTML表单是Web开发中最基本的元素之一&#xff0c;它可以接收用户输入的数据&#xff0c;并通过…

Python 笔记03(多线程)

一 打开命令行&#xff0c;查看本机IP windows r 命令行输入&#xff1a;cmd ipconfig 然后查看IPv4的地址&#xff1a;192.168.1*6.1 ipconfig 二 函数式多进程 from multiprocessing import Process import os, timedef func(name):print(进程的ID&#xff1a;, os.g…

大数据时代,数据治理

一、大数据时代还需要数据治理吗&#xff1f; 数据平台发展过程中随处可见的数据问题 大数据不是凭空而来&#xff0c;1981年第一个数据仓库诞生&#xff0c;到现在已经有了近40年的历史&#xff0c;相对数据仓库来说我还是个年轻人。而国内企业数据平台的建设大概从90年代末…

Docker 自动化部署(保姆级教程)

Docker 自动化部署 1. jenkins 介绍1.1 参考链接&#xff1a;1.2 jenkins 概述1.3 jenkins部署项目的流程 2. jenkins 安装2.1 基于docker 镜像2.2 启动 jenkins 后端服务2.3 登录 jenkins 服务后端 3. jenkins自动化部署开始3.1 下载需要的插件3.2 创建任务3.2.1 描述3.2.2 配…

使用bash脚本编译Qt工程

最近在搭建Qt工程的编译服务器&#xff0c;需要通过shell脚本执行工程的编译过程&#xff0c;写在这里&#xff0c;总结最近的工作。 1. 构建过程 以Windows为例&#xff0c;在QtCreator中左侧选择“项目”便可以看到编译的指令和参数&#xff0c;这些操作也会在我们点击“构建…

git管理常用命令

1、下载代码 git clone 地址2、软件代码提交 1、查看工程中被修改的文件&#xff1a;git status 2.将不需要提交的文件回退&#xff1a;git check <文件路径> 3.更新工程到最新&#xff1a;git pull 4.将本地代码添加到暂存区&#xff1a;git add <将要提交的文件路…

CAN总线数据链路层

CAN报文帧种类: 数据帧:用于发送节点向接收节点传送数据,是使用最多的帧类型远程帧:用于接收节点向某个发送节点请求数据错误帧:用于当某节点检测出错误时向其他节点通知错误的帧过载帧:用于接收节点向发送节点通知自身接收能力的帧帧间隔:将数据帧或远程帧与前面的帧分…

MySQL学习笔记14

MySQL查询之多表查询&#xff1a;&#xff08;了解&#xff09;但是还是要掌握比较好。 1、什么是多表查询&#xff1f; 查询五子句是单表查询&#xff0c;实际工作中&#xff0c;也可能会接触到一个复杂的多表查询。 2、Union 联合查询&#xff1a; union联合查询的作用&…

ElementUI之首页导航与左侧菜单

目录 一、Mock 1.1 什么是Mock.js 1.2 安装与配置 1.2.1 安装mock.js 1.2.2 引入mock.js 1.3 mock.js使用 1.3.1 定义测试数据文件 1.3.2 mock拦截Ajax请求 1.3.3 界面代码优化 二、总线 2.1 定义 2.2 类型分类 2.3 前期准备 2.4 配置组件与路由关系 2.4.1 配置…

Java8实战-总结35

Java8实战-总结35 重构、测试和调试使用 Lambda 重构面向对象的设计模式工厂模式 测试 Lambda 表达式测试可见 Lambda 函数的行为测试使用 Lambda 的方法的行为将复杂的 Lambda 表达式分到不同的方法高阶函数的测试 重构、测试和调试 使用 Lambda 重构面向对象的设计模式 工厂…

JSON数据获取指南!

在互联网时代&#xff0c;数据是金钱的来源。然而&#xff0c;要从海量的网页中提取需要的数据并不容易。本文将带你了解如何使用Node.js编写简易爬虫程序&#xff0c;帮助你轻松获取并处理JSON数据&#xff0c;让你不再为数据发愁。 一、准备工作 安装Node.js&#xff1a;确保…

如何在控制台打印sql语句

步骤一&#xff1a; log4j2.xml中做以下配置 <logger name"xxx.infrastructure.mysql.mapper"level"debug" additivity"false"><appender-ref ref"Console"/></logger>步骤二&#xff1a;IDEA下载Free Mybatis Plu…

9、JavaSE总结

9、JavaSE总结 9.1 Java语言 9.1.1 MarkDown语法 9.1.2 简单的Dos命令 9.1.3计算机语言发展 9.1.4 Java的诞生 1995年诞生&#xff1a;JavaSE、JavaME、JavaEE 2006年Hadoop大数据系列 9.1.5 JDK、JRE JDK&#xff1a;开发者工具包、配置环境变量&#xff08;配置Java…

Vue Mock.js介绍和使用与首页导航栏左侧菜单搭建

前言&#xff1a; 因为使用Vue开发&#xff0c;组件写的太多&#xff0c;组件与组件之间的传递数据复杂&#xff0c;所以要用到Mock和Bus事件 一&#xff0c;关于Mock 1.1.什么是Mock.js Mock.js是一个模拟数据的生成器&#xff0c;用来帮助前端调试开发、进行前后端的原型分离…

upload-labs靶场未知后缀名解析漏洞

upload-labs靶场未知后缀名解析漏洞 版本影响&#xff1a; phpstudy 版本&#xff1a;5.2.17 ​ 1 环境搭建 1.1 在线靶场下载&#xff0c;解压到phpstudy的www目录下&#xff0c;即可使用 https://github.com/c0ny1/upload-labs1.2 已启动&#xff1a;访问端口9000&…