C++之std::function总结(一百六十七)

news2024/12/23 4:41:58

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

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

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

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

欢迎关注Android系统攻城狮

1.前言

本篇目的:std::function总结

2.概念

1. 什么是闭包?

闭包(Closure)是指一个函数捕获并保存了其所在上下文中的变量,即使这些变量在函数执行完毕后也依然可以访问和操作。换句话说,闭包允许一个函数访问其词法作用域外部的变量。
在C++中,闭包通常是通过lambda表达式来实现的。Lambda表达式是一种能够定义匿名函数的方式。它可以捕获当前作用域内的变量,并作为函数对象来调用。

函数指针(Function Pointer)是指一个指向函数的指针变量。可以将函数指针作为参数传递给其他函数,也可以将函数指针作为函数的返回值。

通过使用函数指针,我们可以在运行时动态选择调用的函数。这在编写库、插件等灵活可扩展的程序中非常有用。函数指针还可以用于实现回调函数,即将一个函数作为参数传递给另一个函数,在特定事件发生时被调用。

使用函数指针时,需要注意函数的签名(返回类型和参数列表)。函数指针类型必须与被指向的函数的签名相匹配,否则会导致编译错误。

总结来说,闭包是一种可以捕获外部上下文的函数对象,而函数指针是指向函数的指针变量,可以作为参数传递或者在运行时动态选择调用的函数。

2. 什么是仿函数?

仿函数(Functor)是一种可以像函数一样被调用的对象,在C++中常用于函数对象的实现。它是一个类或结构体,重载了函数调用运算符 operator()。通过在代码中创建并使用仿函数对象,我们可以实现自定义的函数行为和操作。

仿函数可以具有多种形式,可以是普通函数指针、类成员函数指针、函数对象或Lambda表达式。它们可以像函数一样被调用,并接受参数进行处理。因此,在使用仿函数时,可以将其视为可调用的函数对象,具有函数的行为和特性。

显示如何定义和使用一个仿函数

#include <iostream>

// 定义一个加法仿函数
struct AddFunctor {
    int operator()(int a, int b) const {
        return a + b;
    }
};

int main() {
    AddFunctor add; // 创建一个AddFunctor对象

    int result = add(5, 3); // 调用仿函数对象,相当于调用add.operator()(5, 3)

    std::cout << "Result: " << result << std::endl;

    return 0;
}

总结起来,仿函数是一种可调用的对象,可以像函数一样被调用,并具有函数的行为和特性。它是C++中实现函数对象的一种机制,可以用来实现各种灵活的函数行为和操作。

3.function支持对四种函数的封装

function定义通用公式:
std::function<返回类型(参数类型)> 函数对象;

std::function可以封装的几种常见类型的可调用对象

  1. 函数指针:
int add(int a, int b) {
    return a + b;
}

std::function<int(int, int)> func = add;
func(10,20);
  1. 函数对象(仿函数):
struct Multiply {
    int operator()(int a, int b) const {
        return a * b;
    }
};

std::function<int(int, int)> func = Multiply();
func(100,200);
  1. 成员函数指针:
class Math {
public:
    int multiply(int a, int b) {
        return a * b;
    }
};

Math math;
std::function<int(Math*, int, int)> func = &Math::multiply;
func(100,200);

  1. Lambda 表达式:
std::function<int(int, int)> func = [](int a, int b) {
    return a + b;
};

3.应用实例

#include <functional>
#include <iostream>
using namespace std;


int test (int n) {
  printf("line = %d, n = %d\n",__LINE__,n);
  return n;
}

class A {

public:
  A(){};

  int B(int n) {
    printf("line = %d, n = %d\n",__LINE__,n);
    return n;
  }

  int operator() (int n) {
    printf("line = %d, n = %d\n",__LINE__,n);
    return n;
  }

};

int main () {
  test(123);
  //普通函数
  std::function<int (int)> f1 = test;
  f1(456);

  //匿名函数
  std::function<int (int)> f2 = [](int n)->int {
    printf("line = %d, n = %d\n",__LINE__,n);
    return n;
  };
  f2(789);

  //类的成员函数,因为类的成员函数默认会传递该对象的this指针,所以需要写出&A
  std::function<int(A&,int)>  f3 = &A::B;
  A a;
  f3(a,10001);

  //仿函数
  std::function<int (A&, int)> f4 = &A::operator();
  A b;
  f4(b,123);

  return 0;

}

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

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

相关文章

pycharm 远程连接服务器并且debug, 支持torch.distributed.launch debug

未经允许&#xff0c;本文不得转载&#xff0c;vx&#xff1a;837007389 文章目录 step1&#xff1a;下载专业版本的pycharmstep2 配置自动同步文件夹&#xff0c;即远程的工程文件和本地同步2.1 Tools -> Deployment -> configuration2.2 设置同步文件夹2.3 同步服务器…

【Docker】初识Docker以及Docker安装与阿里云镜像配置

目录 一、初识Docker 二、安装Docker 三、Docker架构 四、配置Docker镜像加速器 一、初识Docker Docker是一个开源的应用容器引擎&#xff0c;诞生于2013年&#xff0c;基于Go语言实现&#xff0c;dotCloud公司出品&#xff0c;Docker开源让开发者打包他们的应用以及依赖包到…

SpringMVC-mybatis,SQL语句中误用了desc关键字,导致报错。

17-Jul-2023 21:26:22.295 淇℃伅 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.ApplicationContext.log 1 Spring WebApplicationInitializers detected on classpath 17-Jul-2023 21:26:22.621 淇℃伅 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalin…

TOP命令参数详解

非常详细的top命令介绍&#xff0c;感谢网友分享&#xff0c;参考地址如下 1、TOP命令参数详解---10分钟学会top用法 - 知乎 摘录几个之前不常用的&#xff0c;可能会用到的命令&#xff1a; 1、MEM vs SWAP 第四第五行分别是内存信息和swap信息&#xff0c;所有程序的运行都…

计算机网络网--应用层

目录 应用层概述1.进程通信2. 供应用程序使用的运输服务3.因特网提供的运输服务 一.网络应用模型1.1 C/S模型&#xff08;client/server&#xff0c;客户/服务器模型&#xff09;定义工作原理功能特点优势应用 1.2 P2P&#xff08;peer to peer&#xff09;模型 与 P2P文件分发…

Golang安装

目录 Go安装下载安装Go Go安装 下载安装Go 地址&#xff1a;https://studygolang.com/dl 1、根据系统来选择下载包。 2、我是Window&#xff0c;所以直接下载windows的安装包来安装。 3、在控制台窗口输入“go version”可查看Go版本&#xff0c;检测是否安装成功。 4、配置…

浅谈es5如何保证并发请求的返回顺序

最近在公司实习写的是es5&#xff0c;在和回调地狱经过一番拉扯之后写下这篇文章&#xff0c;也算是体验了一把没有promise的时代 假设我们的div有一个日历列表&#xff0c;但是由于大小关系只能每次显示2天的信息&#xff0c;项目限制只能使用es5&#xff0c;不能使用es6的pro…

WMS是什么意思,WMS有什么功能

阅读本篇文章&#xff0c;您可以了解到&#xff1a;1、WMS的定义&#xff1b;2、WMS的功能&#xff1b;3、WMS的好处&#xff1b;4、WMS的未来。 一、WMS的定义 WMS全称为Warehouse Management System&#xff0c;即仓库管理系统&#xff0c;是一种用于管理和控制仓库操作的软…

Java 中的 ArrayList 和 LinkedList

一、Java 中的列表 1.1 介绍 列表是一种数据结构&#xff0c;为了方便理解&#xff0c;我们可以认为它是动态的数组。众所周知&#xff0c;数组的大小在定义的时候就固定了&#xff0c;不可改变&#xff0c;那么它就无法存储超过它容量的数据&#xff0c;而列表的容量是无限大…

OSI 7层模型 TCPIP四层模型

7层模型&#xff1a; 各层的用途&#xff1a; 应用层&#xff1a;实现各应用之间信息交换的服务&#xff0c;定义了各个应用传输信息格式&#xff0c;即&#xff0c;定义了传输信息的协议&#xff08;如Web应用的传输信息协议 HTTP、远程登录协议Telnet、安全的网络传输协议SS…

机器人制作开源方案 | 可变式智能正姿椅

作者&#xff1a;吴菁菁 徐乐 张志强 单位&#xff1a;河海大学 指导老师&#xff1a;施敏虎 赵建华 一、作品简介 1. 作品介绍 久坐本身及其导致的各种错误坐姿行为常常会引发一系列健康问题&#xff0c;不利于人体健康。 椅子作为人在久坐状态下与人体接触时间最长的工具则…

【Unity实用插件篇】| A* Pathfinding Project - A*寻路插件 的使用教程

前言【Unity实用插件篇】| A*寻路插件学习使用一、A*算法 简述二、A* Pathfinding Project 介绍2.1 A* Pathfinding Project 功能2.2 相关链接2.3 标准版和Pro版区别2.4 A* Pathfinding Project Free与Navigation的对比三、快速搭建一个自己的场景测试寻路3.1 寻路场景搭建3.2 …

大型系统的任务调度模块实现思路

产品需求&#xff1a;需要一个任务调度模块&#xff0c;用户可以通过页面去新建任务&#xff0c;任务主要就是定时发送邮件&#xff0c;或者每周几去发送邮件&#xff0c;用户可以自定义发送的规则&#xff0c;且用户可以暂停任务、删除任务&#xff0c;也能知道任务的执行情况…

查找-多路查找详解篇

多路查找树 多路查找树&#xff08;Multway Search Tree&#xff09;是一种高级的树形数据结构&#xff0c;它 允许每个节点有多个子节点&#xff08;通常大于等于2&#xff09;。多路查找树的每个节点 可以存储多个关键字和对应的值。分类 2-3树&#xff08;2-3 Tree&#x…

红队打靶,红日系列,红日靶场5

文章目录 靶场详情外网渗透端口扫描漏洞发现与利用获取shell 内网渗透提权内网信息收集 横向移动上线msf路由转发与代理通道Psexec 攻击 靶场详情 此次靶场虚拟机共用两个&#xff0c;一个外网一个内网&#xff0c;用来练习红队相关内容和方向&#xff0c;主要包括常规信息收集…

Eurographics 2023最新综述:图形学中的神经-符号模型

随着 CVPR 2023 Best Paper 的公布&#xff0c;其中一篇名为 VISPROG 的工作引起了广泛关注。这项工作利用自然语言指令解决复杂且组合性的视觉任务&#xff0c;重新将神经-符号方法带回了人们的视野&#xff0c;并证明了计算机视觉社区对这种方法的认可。实际上&#xff0c;VI…

Unity自定义后处理——用偏导数求图片颜色边缘

大家好&#xff0c;我是阿赵。   继续介绍屏幕后处理效果的做法。这次介绍一下用偏导数求图形边缘的技术。 一、原理介绍 先来看例子吧。   这个例子看起来好像是要给模型描边。之前其实也介绍过很多描边的方法&#xff0c;比如沿着法线方向放大模型&#xff0c;或者用Ndo…

数据结构和算法——排序算法的比较和排序综测测验

目录 排序算法的比较 排序综合测验 快又稳定 元素错位 有序排序 排序结果 排序算法的比较 排序方法平均时间复杂度最坏情况下时间复杂度额外空间复杂度稳定性简单选择排序不稳定冒泡排序稳定直接插入排序稳定希尔排序不稳定堆排序不稳定快速排序不稳定归并排序稳定基数排…

SCT2632——65V输出3A非同步整流DCDC转换器

SCT2632是一款3A降压转换器&#xff0c;具有宽输入电压&#xff0c;从4.2V到60V&#xff0c;集成了220mΩ高压侧MOSFET。SCT2632采用峰值电流模式控制&#xff0c;支持脉冲跳过调制&#xff08;PSM&#xff09;&#xff0c;以帮助转换器在轻负载或待机状态下实现高效率条件。SC…

矿用人员定位系统在矿山事故预防中的效果评估

矿业行业的高风险和复杂环境使得采矿安全成为一项重要的挑战。为了保障矿工的安全并减少事故风险&#xff0c;矿用人员定位系统成为了关键技术之一。 在这篇文章中&#xff0c;华安联大便和大家各位朋友一起探讨矿用人员定位系统的重要性、工作原理、作用&#xff0c;并通过真…