C++Lambda表达式介绍

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

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

相关文章

SQL Developer 小贴士:PL/SQL语法分析

对于SQL或PL/SQL中的语法错误和警告&#xff0c;SQL Developer可以用不同颜色的下划波浪线显示。 启用语法分析&#xff0c;可以用菜单Tool>Preferences>Code Editor>Completion Insight>Enable Semantic Analysis Info Tips 例如&#xff0c;以下的代码中&…

blender bvh显示关节名称

导入bvh&#xff0c;菜单选择布局&#xff0c;右边出现属性窗口&#xff0c; 在下图红色框依次点击选中&#xff0c;就可以查看bvh关节名称了。

自考《计算机网络原理》考前冲刺

常考选择填空 1、计算机网络的定义&#xff1a;计算机网络是互连的、自治的计算机的集合。 2、协议的定义&#xff1a;协议是网络通信实体之间在数据交换过程中需要遵循的规则或约定 3、协议的3个要素 (1) 语法&#xff1a;定义实体之间交换信息的格式与结构&#xff0c;或…

设计模式六:策略模式

1、策略模式 策略模式定义了一系列的算法&#xff0c;并将每一个算法封装起来&#xff0c;使每个算法可以相互替代&#xff0c;使算法本身和使用算法的客户端分割开来&#xff0c;相互独立。 策略模式的角色&#xff1a; 策略接口角色IStrategy&#xff1a;用来约束一系列具体…

第一次开机开机动画结束后闪白屏

开机动画结束会闪下白屏&#xff0c;再进入launcher 思路 : 分析下从开机动画结束到launcher起来之间的流程步骤 从ZygoteInit.java开始分析 &#xff1a; SystemServer起来后会启动一些核心服务 attachApplication方法中主要创建了Application和Activity 接下里RootActivityC…

快速搭建网站原型!8款网站原型软件推荐

现在&#xff0c;基于云的软件已经逐渐成为主流&#xff0c;网站原型设计工具也不例外。与桌面版本相比&#xff0c;在线原型工具具有独特的优势&#xff0c;无论您使用Linux&#xff0c;Mac 或者Windows&#xff0c;都不需要安装就可以使用这些工具。下面小编就为大家推荐8款非…

c++入门学习⑧——模板

目录 前言 基本介绍 什么是模板&#xff1f; 作用 特点 分类 函数模板 语法 使用方式 注意事项 函数模板和普通函数区别 普通函数和函数模板的调用规则 局限性 类模板 语法 类模板的成员函数创建时机 类模板实例化对象 类模板实例化对象做函数参数 类模板成…

普中51单片机学习(LCD1602)

LCD1602 1602液晶也叫1602字符型液晶&#xff0c;它是一种专门用来显示字母、数字、符号的点阵型液晶模块。它是由若干个5x7或者5x10的点阵字符位组成&#xff0c;每个点阵字符位都可以用显示一个字符&#xff0c;每位之间有一个点距的间隔&#xff0c;每行之间也有间隔&#…

代码随想录算法训练营29期|day60 任务以及具体安排

第九章 动态规划part17 647. 回文子串 class Solution {public int countSubstrings(String s) {char[] chars s.toCharArray();int len chars.length;boolean[][] dp new boolean[len][len];int result 0;for (int i len - 1; i > 0; i--) {for (int j i; j < le…

C++ 高频考点

1. C/C内存有哪几种类型&#xff1f; C中&#xff0c;内存分为5个区&#xff1a;堆(malloc)、栈(如局部变量、函数参数)、程序代码区&#xff08;存放二进制代码&#xff09;、全局/静态存储区&#xff08;全局变量、static变量&#xff09;和常量存储区&#xff08;常量&…

YOLOv9来了!实时目标检测新SOTA

先上一把网上的测试效果对比: YOLOv9架构图 速度论文 代码&#xff1a;GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information 论文&#xff1a;[2402.13616] YOLOv9: Learning What You…

HTTP/HTTPS协议

什么是HTTP协议 HTTP被称为超文本传输协议(里面不仅仅可以是字符串,还可以是图片,特殊字符等),这是一种应用非常广泛的应用层协议. HTTP协议诞生于1991年,现在是最主流使用的一种应用层协议.它从诞生到现在为止迭代了多个版本. 但目前最主流使用的还是HTTP1.1和HTTP2.0. HTTP协…

Java数据结构---初识集合框架

目录 一、什么是集合框架 二、集合框架的重要性 三、背后涉及的数据结构及算法 1.什么是数据结构 2.容器背后对应的数据结构 3.相关的Java知识 4.什么是算法 一、什么是集合框架 Java 集合框架 Java Collection Framework &#xff0c;又被称为容器 container &#xff0…

Unity编辑器内工程文件重命名|Project视图文件名修改

Unity编辑器内文件重命名 前言大项内容一使用方法代码展示 总结 前言 本文代码可以一键更改Project视图的文件名字 在当前文件名的状态下增加一段字符区分文件。 大项内容一 功能是因为在给其他人导入项目资源时有重复的资源的时候&#xff0c;资源会产生覆盖的问题。所以直…

家用办公主机需要多少钱?推荐主机选购攻略!!

1.头部部分 本文将长期保持更新&#xff0c;您可以保存并随时查看。 过去推荐的 主持人推荐 以下家庭办公主机均采用性能强劲的12/13代i5配置&#xff0c;可以完美应对日常办公、平面设计、编辑等使用场景。 主机价格在4K左右&#xff0c;自带显示器&#xff0c;并附有三到…

xss靶场实战(xss-labs-master靶场)

xss-labs-master靶场链接&#xff1a;https://pan.baidu.com/s/1X_uZLF3CWw2Cmt3UnZ1bTw?pwdgk9c 提取码&#xff1a;gk9c xss-labs level 1 修改 url 地址中的name<script>alert(1)</script>&#xff0c;便可以通关 level 2 在搜索框中输入的 JS 代码无法执行 …

用户体验设计师如何在 2024抢占先机?

01. 严峻的经济形势和就业市场 我们生活在一个通货膨胀的时代。就从超市抓几个苹果、卷心菜、鸡蛋&#xff0c;看看价格吧&#xff01;我不得不多次检查收据&#xff0c;因为我简直不敢相信。外出就餐费用上涨了 10-20%&#xff0c;现在 Spotify 和 YouTube 要求收取更高的订阅…

STM32通用定时器输入捕获

通用定时器输入捕获部分框图介绍 通用定时器输入捕获脉宽测量原理 要测量脉宽的高电平的时间&#xff1a;t2-t1&#xff08;脉宽下降沿时间点-脉宽上升沿时间点&#xff09; 假设&#xff1a;递增计数模式 ARR&#xff1a;自动重装载寄存器的值 CCRx1&#xff1a;t1时间点CCRx…

Google炸场,推出开“放”可商用的大语言模型Gemma!超级轻量,个人电脑即可运行

与OpenAI的封闭式大型模型不同&#xff0c;谷歌、Meta等科技巨头正致力于开发开源模型&#xff0c;以期实现技术上的快速追赶。 介绍 2月21日&#xff0c;谷歌发布了其最新一代的开源AI模型——Gemma&#xff08;https://ai.google.dev/gemma&#xff09;&#xff0c;这是一个…

2024.2.29 模拟实现 RabbitMQ —— 项目展示

目录 项目介绍 核心功能 核心技术 演示直接交换机 演示扇出交换机 演示主题交换机 项目介绍 此处我们模拟 RabbitMQ 实现了一个消息队列服务器 核心功能 提供了 虚拟主机、交换机、队列、绑定、消息 概念的管理九大核心 API 创建队列、销毁队列、创建交换机、销毁交换机、…