C++Lambda表达式介绍

news2024/10/1 5:39:21

C11中引入了Lambda表达式,Lambda表达式是一种匿名函数,它可以在需要函数的地方直接定义和使用,而无需显式地定义一个函数。

lambda表达式

Lambda表达式语法定义
在这里插入图片描述

[capture-list](parameters) -> return-type { statement }
capture-list是:用来捕获外部变量的列表
parameters是:函数的参数列表
return-type是:返回值类型
statement是:函数体

关于capture-list的几种形式
[]:空的capture-list,不捕获任何外部变量
[var]:捕获单个变量,通过值进行捕获
[&var]:捕获单个变量,通过引用进行捕获
[=]:通过值捕获所有外部变量
[&]:通过引用捕获所有外部变量
[this]:以值方式捕获当前对象的指针(指向当前类对象的指针,在成员函数内使用, 使得在lambda函数内部访问成员变量和成员函数成为可能)
这些形式可以组合使用,用逗号分隔。例如,[x, &y]表示通过值捕获变量x,通过引用捕获变量y。

Lambda表达式的优缺点

优点

  • 可以直接在需要调用函数的位置定义短小精悍的函数,而不需要预先定义好函数
  • 使用Lamdba表达式变得更加紧凑,结构层次更加明显、代码可读性更好

缺点

  • Lamdba表达式语法比较灵活,增加了阅读代码的难度;
  • 对于函数复用无能为力;

Lambda表达式和shared_from_this()

Lambda表达式和shared_from_this()是C++中两个不同的概念,它们在一些情况下可以结合使用。

Lambda表达式可以在代码中直接定义匿名的、可调用的函数。Lambda函数可以捕获外部变量,并且可以使用[]语法来指定捕获方式。Lambda表达式常用于替代传统的函数对象或函数指针。

shared_from_this()是一个成员函数,它位于一个继承自std::enable_shared_from_this的类中。它的作用是返回一个std::shared_ptr,该智能指针可以安全地管理当前对象的生命周期。

这两个概念的关系在于,当我们需要在Lambda表达式中访问当前对象(即Lambda表达式所在的类的实例)时,可以使用shared_from_this()来获取指向当前对象的std::shared_ptr。这样可以保证在Lambda表达式执行期间,当前对象不会意外地被销毁,从而避免悬空指针的问题。

需要注意的是,使用shared_from_this()必须满足两个条件:

  1. 对象必须通过std::shared_ptr来管理其生命周期。
  2. 调用shared_from_this()的代码必须在对象生命周期内,即不能在对象已经被释放后调用shared_from_this()。

总结起来,Lambda表达式和shared_from_this()可以结合使用,以确保在Lambda表达式中安全地访问当前对象。

#include <memory>
#include <iostream>
class A : public std::enable_shared_from_this<A> {
public:
    void someFunction() {
        std::cout << "Calling someFunction() in class A" << std::endl;
        // 使用Lambda表达式调用另一个函数
        auto lambda = [shared_this = shared_from_this()]() {
            std::cout << "Calling lambda function" << std::endl;
            shared_this->anotherFunction(); // 调用类A中的另一个函数
        };
        lambda();
    }
    void anotherFunction() {
        std::cout << "Calling anotherFunction() in class A" << std::endl;
    }
};
class B {
public:
    void doSomething() {
        std::cout << "Calling doSomething() in class B" << std::endl;
        // 创建类A的智能指针并调用其中的函数
        std::shared_ptr<A> a = std::make_shared<A>();
        a->someFunction();
    }
};
int main() {
    B b;
    b.doSomething();
    return 0;
}

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

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

相关文章

Linux服务器节点性能问题排查和优化思路

Linux服务器节点性能问题排查和优化思路 1. atop安装2. 整体思路2.1 如果现场存在/能复现2.2 如果现场不能复现&#xff1a; 3. 高负载问题排查与应对3.1. hung task 问题3.2. 底层硬盘/文件系统无法写入3.3. IO性能不足导致的运行缓慢3.4. CPU 性能不足导致的运行缓慢&#xf…

Go语言必知必会100问题-05 接口污染

接口污染 在Go语言中&#xff0c;接口是我们设计和编写代码的基石。然而&#xff0c;像很多概念一样&#xff0c;滥用它是不好的。接口污染是指用不必要的抽象来编写代码&#xff08;刻意使用接口&#xff09;&#xff0c;使得代码更难以理解。这是具有不同习惯&#xff0c;特…

linux常用的网络命令实战分享

文章目录 ifup/down命令ifconfig命令观察网络接口信息修改接口参数增加虚拟网络接口 route命令查看路由表增加路由表规则删除路由表规则 IP 命令ip linkip addr设定路由 ip route arp 命令 在实际研发运维工作中常常会涉及到网关相关的操作和知识&#xff0c;这里对linux下常用…

玩转ChatGPT:参考文献速查

一、写在前面 各位大佬&#xff0c;我又回来了&#xff0c;最近2月太忙啦&#xff08;过年、奶娃、本子、材料、结题&#xff09;&#xff0c;断更了。现水一篇证明我还活着&#xff01;&#xff01;&#xff01; 最近在写国自然本子&#xff0c;遇到一个估计大家都会遇到的问…

FMM 笔记:FMM(colab上执行)【官方案例解读】

在colab上运行&#xff0c;所以如何在colab上安装fmm&#xff0c;可见FMM 笔记&#xff1a;在colab上执行FMM-CSDN博客 fmm见&#xff1a;论文笔记&#xff1a;Fast map matching, an algorithm integrating hidden Markov model with precomputation_ubodt(upper bounded ori…

离散数学——树思维导图

离散数学——树思维导图 文章目录 前言内容大纲参考 前言 这是当初学习离散数学时整理的笔记大纲&#xff0c;其中包含了自己对于一些知识点的体悟。现将其放在这里作为备份&#xff0c;也希望能够对你有所帮助。 当初记录这些笔记只是为了在复习时更快地找到对应的知识点。…

vant安装教程(基于vue3)

1、先安装 npm i vant 如果不行安装这个 yarn add vant 2、在main.js中引入即可 import { createApp } from vue import App from ./App.vue import router from ./router import store from ./store import { Button } from vant; import vant/lib/index.css;createApp(App).…

一分钟带你入门MVVM和ViewModel

目录 0.为啥用ViewModel进行数据的存取 1.MVVM的具体含义 2.viewModel内部构造 3.配置viewModel 3.1 声明一个ViewModel实例类 3.2 viewModel功能实现 0.为啥用ViewModel进行数据的存取 通过持有LiveData维护保存数据的状态 为啥维护 &#xff1f; &#xff1a; 当Activi…

数据安全策略

当您在第一线担负着确保公司的信息和系统尽可能免受风险的关键职责时&#xff0c;您的数据安全策略需要复杂且多层次。威胁可能有多种形式&#xff1a;恶意软件、黑客攻击、财务或信息盗窃、破坏、间谍活动&#xff0c;甚至是您信任的员工故意或无意的活动造成的。因此&#xf…

成都直播基地用心建设三大生态服务体系服务支撑西部电商

天府锋巢直播产业基地用心建设三大生态服务体系的服务支撑&#xff0c;这为直播行业更加完善的提供了全生命周期的服务方案&#xff0c;成都直播基地助力创业者更好地“开源节流”。 首先&#xff0c;天府锋巢直播产业基地作为成都规模最大的直播基地&#xff0c;具有全面的基…

什么是DOM?(详解)

什么是DOM&#xff1f; DOM的定义知识回顾什么是D&#xff1f;什么是O&#xff1f;什么是M&#xff1f;什么是DOM树&#xff1f;根节点对象与节点对象 DOM树简单举例DOM的主要用途 DOM的定义 DOM&#xff08;Document Object Model&#xff0c;文档对象模型&#xff09; W3C对…

23年中科院1区算法|长鼻浣熊优化算法COA原理及其利用与改进(Matlab/Python)

文章来源于我的个人公众号&#xff1a;KAU的云实验台&#xff0c;主要更新智能优化算法的原理、应用、改进 CEC2005中的测试 本文 KAU将介绍一个2023年1月发表在中科院1区KBS上的优化算法——长鼻浣熊优化算法(Coati Optimization Algorithm&#xff0c;COA)[1] 该算法由Dehg…

【Zotero】在zotero中如何重新编辑文献条目信息

博主最近在使用zotero中&#xff0c;当将下载好的文献直接拖拽到相应文件夹目录下后&#xff0c;一般系统会自动查找到文献的条目信息&#xff0c;可是有时候会出现自动查找的文献条目信息与真实的文献内容不一致的情况&#xff0c;这时需要手动重新编辑文献条目信息。这里将博…

设计模式(三)建造者模式

相关文章设计模式系列 1.建造者模式简介 定义 建造者模式&#xff08;builder&#xff09;&#xff0c;将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 简介 建造者模式&#xff08;builder&#xff09;是创建一个复杂对象的创建型…

【随笔】固态硬盘数据删除无法恢复(开启TRIM),注意数据备份

文章目录 一、序二、机械硬盘和固态硬盘的物理结构与工作原理2.1 机械硬盘2.11 基本结构2.12 工作原理 2.2 固态硬盘2.21 基本结构2.22 工作原理 三、机械硬盘和固态硬盘的垃圾回收机制3.1 机械硬盘GC3.2 固态硬盘GC3.3 TRIM指令开启和关闭 四、做好数据备份 一、序 周末电脑突…

爬某网站延禧宫率第一集视频

import requests import re from tqdm import tqdm # 网址链接&#xff1a;https://v.ijujitv.cc/play/24291-1-1.html url https://v6.1080pzy.co/20220801/urxniJCN/hls/index.m3u8 headers {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Appl…

【Golang切片】

切片 切片的引入内存分析切片的定义切片的遍历切片注意事项 切片的引入 【1】切片&#xff08;slice&#xff09;是golang中一种特有的数据类型 【2】数组有特定的用处&#xff0c;但是却有一些呆板&#xff08;数组长度固定不可变&#xff09;&#xff0c;所以在Go语言的代码…

第六十八天 APP攻防-XposedFridaHook证书校验反代理代理转发

第68天 APP攻防-Xposed&Frida&Hook&证书校验&反代理&代理转发 知识点&#xff1a; 1、APP防代理绕过-应用&转发 2、APP证书校验类型-单向&双向 3、APP证书校验绕过-Frida&XP框架等 章节点&#xff1a; 1、信息收集-应用&资产提取&权…

游戏 CP 专访| InOutPath 技术干货分享!

“ 编辑语&#xff1a;STEAM 上的 3D 解密游戏《InOutPath》以其清新的画面&#xff0c;独特的玩法&#xff0c;受到了广大 STEAM 玩家&#xff0c;以及 Cocos 开发者们的关注。今天有幸邀请到了这款游戏的开发商&#xff0c;为大家做一次技术分享。希望能够对在用 Cocos Creat…

嵌入式中逻辑分析仪基本操作方法

前期准备 1.一块能触摸的屏对应的主板机 2.逻辑分析仪对应的软件工具 3.对应的拓展板 4.确定拓展板的引脚分布情况 第一步&#xff1a;逻辑分析仪j基本操作 1.数据捕捉需要先进行对应软件安装,并按照需求进行配置 2.这里以A20为例:此手机使用显示驱动芯片CST148,触摸屏分辨…