[C++11] lambda表达式


文章目录

  • Lambda表达式简介
        • 捕获列表的常见写法:
  • Qt中的`connect`和Lambda
          • 常规的 `connect()` 方式:
          • 使用Lambda表达式的 `connect()`:
          • 代码示例:
  • 捕获外部变量在 Qt 信号槽中的应用
  • Lambda在Qt中的使用优势
  • 总结
      • 参考代码总结:

Lambda表达式简介

Lambda表达式 是C++11引入的一种简洁的函数定义方式,主要用于定义临时的匿名函数。它的语法如下:

[捕获列表](参数列表) -> 返回类型 {// 函数体
};

其中:

  • 捕获列表:指定了外部变量在 Lambda 中的使用方式,可以按值或按引用捕获外部变量。
  • 参数列表:类似于普通函数的参数,传入函数的参数。
  • 返回类型:指定函数的返回类型,通常可以省略,由编译器推导。
  • 函数体:Lambda 的具体执行逻辑。

来看几个 Lambda 表达式的使用例子:

int value = 100;// 按值捕获:Lambda 表达式只能读取外部变量,但不能修改它
auto f1 = [value](int a, int b) -> int {return a + b + value;
};// 按引用捕获:Lambda 表达式可以修改外部变量的值
auto f2 = [&value](int a, int b) -> int {value++;return a + b;
};// 隐式捕获:使用等号`=`表示按值捕获,使用&表示按引用捕获
auto f3 = [=](int a, int b) -> int {// value++;  // 按值捕获的变量不能修改return a + b;
};auto f3 = [&](int a, int b) -> int {// value++;  // 按值捕获的变量不能修改return a + b;
};
捕获列表的常见写法:
  1. 值捕获[value],捕获 value 的拷贝,只能读取,不能修改其原值。
  2. 引用捕获[&value],通过引用捕获 value,Lambda 中可以修改它。
  3. 隐式捕获[=][&]= 表示按值捕获外部所有变量,& 表示按引用捕获外部所有变量。

Qt中的connect和Lambda

在Qt中,信号槽(Signal-Slot)机制是其核心机制之一,用于对象之间的通信。在使用 connect() 时,我们通常会将信号连接到槽函数。但是,随着 Qt5 的引入,我们可以用 Lambda 表达式作为槽函数,使得代码更加简洁和灵活。

常规的 connect() 方式:
connect(senderObject, SIGNAL(signalName()), receiverObject, SLOT(slotFunction()));
使用Lambda表达式的 connect()
connect(senderObject, &SenderClass::signalName, receiverObject, [=]() {// Lambda 表达式的槽逻辑qDebug() << "Lambda slot called";
});
代码示例:

假设我们有一个按钮点击事件,可以这样使用 Lambda 表达式来响应按钮点击:

QPushButton* button = new QPushButton("Click me", this);
connect(button, &QPushButton::clicked, this, [=]() {// Lambda作为槽函数qDebug() << "Button clicked!";
});

在这里,clicked 信号连接了一个 Lambda 表达式。每次用户点击按钮时,Lambda 中的代码就会被执行。

捕获外部变量在 Qt 信号槽中的应用

connect() 函数中,Lambda 表达式的强大之处在于它允许我们在槽函数中捕获外部变量。这使得处理局部状态变得更加灵活。例如,我们可以在按钮点击时修改局部变量的值:

int count = 0;
connect(button, &QPushButton::clicked, this, [&count]() {count++;qDebug() << "Button clicked" << count << "times";
});

在这个例子中,count 是通过引用捕获的,所以每次点击按钮时,count 的值都会递增。

Lambda在Qt中的使用优势

  1. 简洁代码:使用 Lambda 表达式可以避免专门编写槽函数,使代码更加简洁。
  2. 灵活捕获变量:Lambda 捕获外部变量的能力让开发者可以轻松处理局部状态,减少全局变量的使用。
  3. 槽函数内联化:使用 Lambda 可以将槽函数写在 connect() 内部,不需要额外定义。

总结

Lambda 表达式不仅在标准 C++ 中非常有用,在 Qt 的信号槽机制中也是极其强大和灵活的工具。它允许我们轻松地捕获上下文变量,并以更清晰、更简洁的方式处理事件响应。特别是在复杂的 UI 交互中,Lambda 表达式能够极大地简化代码结构。

参考代码总结:

QPushButton* button = new QPushButton("Click me", this);
int count = 0;// 使用 Lambda 表达式作为槽函数,按引用捕获 count 变量
connect(button, &QPushButton::clicked, this, [&count]() {count++;qDebug() << "Button clicked" << count << "times";
});

通过这种方式,你可以避免为简单的事件响应编写额外的槽函数,并让代码更易读。

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

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

相关文章

目标检测与图像分类:有什么区别?各自的使用场景是什么?

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Android阶段学习思维导图

前言 记录下自己做的一个对Android原生应用层的思维导图&#xff0c;方便个人记忆扩展&#xff1b;这里只露出二级标题。 后语 虽然有些内容只是初步了解&#xff0c;但还是记录了下来&#xff1b;算是对过去一段学习的告别。

EtherNet/IP 转 EtherNet/IP, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899 协议转换通信网关 EtherNet/IP 转 EtherNet/IP GW系列型号 MS-GW22 概述 简介 MS-GW22 是 EtherNet/IP 和 EtherNet/IP 协议转换网关&#xff0c;…

ThreeJS入门(092):THREE.Curve 知识详解,示例代码

作者&#xff1a; 还是大剑师兰特 &#xff0c;曾为美国某知名大学计算机专业研究生&#xff0c;现为国内GIS领域高级前端工程师&#xff0c;CSDN知名博主&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;webgl&#xff0c;ThreeJS&#xff0c;canvas&#xf…

厂商资源分享网站

新华三&#xff08;H3C&#xff09;是一家中国知名的网络设备供应商&#xff0c;提供网络设备、网络解决方案和云计算服务。公司成立于2003年&#xff0c;是华为公司和惠普公司合资的企业&#xff0c;总部位于中国深圳。 华为&#xff08;Huawei&#xff09;是一家全球知名的电…

使用rsync+jenkins实现服务自动部署全流程

项目背景&#xff1a;城市政务云服务器没有上k8s&#xff0c;所有后端服务都是原始方式部署启动 &#xff08;java -jar xxx.jar&#xff09;&#xff0c;那么有没有方式简化部署难度&#xff0c;实现自动部署&#xff1f;当然是有的&#xff0c;下面详细介绍&#xff08;以Cen…

前端工程化 - Vue

环境准备 Vue-cli是Vue官方提供的一个脚手架&#xff0c;用户快速生成一个Vue的项目模板。 Vue-cli提供了如下功能&#xff1a; 统一的目录结构本地调试热部署单元测试集成打包上线 需要安装Node.js 安装Vue-cli npm install -g vue/cli通过vue --version指令查看是否安装成…

vite学习教程03、vite+vue2打包配置

文章目录 前言一、修改vite.config.js二、配置文件资源/路径提示三、测试打包参考文章资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝3W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容&…

数学概念算法-打印100以内的素/质数

素数&#xff1a;只能被1和自己整除的数 暴力破解 埃氏筛选 找到第一个数字&#xff0c;如果它是素数&#xff0c;则把它的倍数全部划掉 比如数字2是素数&#xff0c;那么 4,6,8,10,12。这些数字肯定不是素数&#xff0c;所以不用再考虑&#xff0c;直接划掉即可 第二步&#…

20年408数据结构

第一题&#xff1a; 解析&#xff1a;这种题可以先画个草图分析一下&#xff0c;一下就看出来了。 这里的m(7,2)对应的是这图里的m(2,7),第一列存1个元素&#xff0c;第二列存2个元素&#xff0c;第三列存3个元素&#xff0c;第四列存4个元素&#xff0c;第五列存5个元素&#…

【ubuntu】ubuntu20.04安装chrome浏览器

1.下载 https://download.csdn.net/download/qq_35975447/89842972 https://www.google.cn/chrome/ 2.安装 sudo dpkg -i google-chrome-stable_current_amd64.deb 3.使用

数据结构 ——— 单链表oj题:反转链表

目录 题目要求 手搓一个简易链表 代码实现 题目要求 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表 手搓一个简易链表 代码演示&#xff1a; struct ListNode* n1 (struct ListNode*)malloc(sizeof(struct ListNode)); assert(n1);…

1.2.2 计算机网络的分层结构(下)

水平视角 YSCS协议&#xff08;压缩传输协议&#xff09; 发送方先压缩然后接收方再解压。 为什么要分层&#xff1f;为什么要制定协议&#xff1f; 计算机网路功能负责->采用分层结构&#xff0c;将诸多功能合理地划分在不同层次->对等层之间制定协议&#xff0c;以…

如何彻底掌握 JavaScript 设计模式 23 大核心模式助你提升编程水平

如何彻底掌握 JavaScript 设计模式 23 大核心模式助你提升编程水平 设计模式是解决特定问题的常用解决方案&#xff0c;它们可以帮助开发者编写更清晰、可维护、可扩展的代码。在 JavaScript 中&#xff0c;常见的设计模式可以分为三大类&#xff1a;创建型模式、结构型模式 和…

什么样的孩子适合学C++?

随着科技的飞速发展&#xff0c;编程已成为许多家长和教育者重视的技能之一。在众多编程语言中&#xff0c;C因其强大的功能和广泛的应用&#xff0c;成为许多青少年学习编程的首选。然而&#xff0c;C相较于其他编程语言&#xff0c;如Python或Scratch&#xff0c;其学习难度更…

【书生浦语实战】茴香豆企业级知识库问答工具-搭建Dify问答助手

快速结论 1、用茴香豆快速搭建Dify问答助手&#xff0c;自带拒答、rerank、切片长度判断、阈值调节功能&#xff0c;回答还能带出图片&#xff0c;顶呱呱&#x1f44d; 2、茴香豆git仓地址&#xff1a;https://github.com/internlm/huixiangdou 遇到问题去翻这里会更多解释&…

【Linux探索学习】第三弹——Linux的基础指令(下)——开启新篇章的大门

Linux基础指令&#xff08;上&#xff09;&#xff1a; 【Linux探索学习】第一弹——Linux的基本指令&#xff08;上&#xff09;——开启Linux学习第一篇-CSDN博客 Linux基础指令&#xff08;中&#xff09;&#xff1a; 【Linux探索学习】第二弹——Linux的基础指令&#…

MySQL多表查询:列子查询

先看我的表数据 dept表 emp表 列子查询&#xff0c;也就是多列作为子查询去寻找一些问题 常用操作符&#xff1a;IN, NOT IN, ANY, SOME, ALL 1.查询 "销售部" 和 "市场部" 的所有员工的信息&#xff08;拆分成以下两个问题&#xff09; a. 查询"销…

[Python学习日记-40] 函数进阶之装饰器

[Python学习日记-40] 函数进阶之装饰器 简介 引子 什么是装饰器 装饰器终结版 装饰器的层层叠加 简介 在前面铺垫了这么多终于该讲到重点了&#xff0c;前面说的匿名函数、高阶函数、闭包等等都是为了这篇文章所讲的装饰器而使用的&#xff0c;本篇文章将会一一个故事通俗…

Redis:list类型

Redis&#xff1a;list类型 list命令非阻塞LPUSHLRANGELPUSHXRPUSHRPUSHXLPOPRPOPLINDEXLINSERTLLENLREMLTRIMLSET 阻塞BLPOPBRPOP 内部编码ziplistlinkedlistquicklist 几乎每种语言都有顺序表、数组、链表这样的顺序结构&#xff0c;Redis也做出了相应的支持。 如图&#xff…