C++ Lambda函数

lambda语法

[capture list] (parameter list) specifiers exception -> type { function body }
  • [capture list]是捕获列表,在应用中必填。

  • (parameter list)是参数列表,在应用中选填。

  • specifiers是限定符,在应用中选填。

  • exception是异常说明符,在应用中选填。

  • -> type是返回值类型,在应用中选填。

  • { function body }是表达式的函数体,在应用中必填。

lambda表达式返回值类型;如果不指定返回类型,则编译器会根据代码实现为函数推导一个返回类型;如果没有返回值,则可忽略此部分。

[capture list]说明

关于中括号,有三种形式[],[&],[=],[=,&c](混合模式)

[]   : 当前作用域的参数不拷贝到lambda函数

[&] : 将当前作用域的变量作为引用传入lambda函数

[=]:  将当前作用域的变量作为形参传入lambda函数

[=,&paramx] :表示paramx是引用,其他的是形参

specifiers 说明

限定符值为mutable,含义是可以在函数体内修改按值捕获的变量;如果不需要此操作,则可以省略。

exception说明

异常说明符值为noexcept,含义是表达式不会抛出异常;如果不需要此操作,则可以省略。

Lambda表达式的优缺点

Lambda表达式有以下优点:

  1. 简洁:Lambda表达式可以在一个表达式中定义一个函数,不需要单独声明和定义。

  2. 方便:Lambda表达式可以捕获外部变量,使得函数对象更加灵活和易于使用。

  3. 通用:Lambda表达式可以作为任何需要函数对象的地方使用,例如STL算法、线程等。

Lambda表达式也有一些缺点:

  1. 可读性:Lambda表达式可能过于简洁,难以阅读和理解。

  2. 复杂性:Lambda表达式可以包含复杂的逻辑和控制流,使得代码难以维护和调试。

  3. 性能:Lambda表达式可能会产生额外的开销,例如变量捕获和函数调用的开销。

lambda声明

 Reader<Message> logger(kQueueName, [](const Message& data) {std::cout << "Received coordinate " << data << std::endl;});

测试代码

#include <fstream>
#include <iostream>
#include <thread>
#include <vector>#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>std::string kQueueName = "/test2";class MessageQueue {private:mqd_t handle;public:MessageQueue(const std::string& name, int flags) {handle = mq_open(name.c_str(), flags);if (handle < 0) {throw std::runtime_error("Failed to open a queue for writing");}}MessageQueue(const std::string& name, int flags, int max_count, int max_size) {struct mq_attr attrs = { 0, max_count, max_size, 0 }; handle = mq_open(name.c_str(), flags | O_CREAT, 0666, &attrs);if (handle < 0) {throw std::runtime_error("Failed to create a queue");}}~MessageQueue() {mq_close(handle);}void Send(const char* data, size_t len) {if (mq_send(handle, data, len, 0) < 0) {throw std::runtime_error("Failed to send a message");}}void Receive(char* data, size_t len) {if (mq_receive(handle, data, len, 0) < len) {throw std::runtime_error("Failed to receive a message");}}
};template<class T>
class Writer {private:MessageQueue queue;public:Writer(std::string& name):queue(name, O_WRONLY) {}void Write(const T& data) {queue.Send(reinterpret_cast<const char*>(&data), sizeof(data));}
};template<class T>
class Reader {private:MessageQueue queue;void (*func)(const T&);public:Reader(std::string& name, void (*func)(const T&)):queue(name, O_RDONLY), func(func) {}void Run() {T data;while(true) {queue.Receive(reinterpret_cast<char*>(&data), sizeof(data));func(data);}}
};struct Message {int x, y;
};std::ostream& operator<<(std::ostream& o, const Message& m) {o << "(x=" << m.x << ", y=" << m.y << ")";
}void DoWrites() {std::vector<Message> messages {{1, 0}, {0, 1}, {1, 1}, {0, 0}};Writer<Message> writer(kQueueName);for (const auto& m : messages) { std::cout << "Write " << m << std::endl;writer.Write(m);std::this_thread::sleep_for(std::chrono::milliseconds(10));}
}void DoReads() {Reader<Message> logger(kQueueName, [](const Message& data) {std::cout << "Received coordinate " << data << std::endl;});logger.Run();
}int main(int argc, char** argv) {MessageQueue q(kQueueName, O_WRONLY, 10, sizeof(Message));pid_t pid = fork();if (pid) {DoWrites();std::this_thread::sleep_for(std::chrono::milliseconds(100));kill(pid, SIGTERM);} else {DoReads();}
}

我公司承接各类技术服务,主要聚焦于:stm32、单片机、嵌入式、QT应用开发、Web+Python+Django应用开发。欢迎合作。

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

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

相关文章

Java对接腾讯云直播示例

首先是官网的文档地址 云直播 新手指南 可以发现它这个主要是按流量和功能收费的 价格总览 流量这里还只收下行的费用&#xff0c;就是只收观看消耗的流量费 其它的收费就是一些增值业务费 &#xff08;包括直播转码、直播录制、直播截图、直播审核、智能鉴黄、实时监播、移动直…

【性能测试】Jmeter性能压测-阶梯式/波浪式场景总结(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、阶梯式场景&am…

学习JAVA的第十四天(基础)

目录 Collection集合 迭代器遍历 增强for遍历 Lambda表达式遍历 List集合 遍历 数据结构 栈 队列 数组 链表 前言&#xff1a; 学习JAVA的第十三天 Collection集合 Collection的遍历方式&#xff1a; 迭代器&#xff08;不依赖索引&#xff09;遍…

爱普生宣布开发出独特的宽幅度LVDS输出 —可灵活选择与LSI

爱普生宣布开发出独特的宽幅度LVDS输出 —可灵活选择与LSI -相匹配的低噪声输出 精工爱普生公司(TSE: 6724&#xff0c;“爱普生”)开发了一种新的晶体振荡器差分输出方案。新方案&#xff0c;宽幅低压差分信号(WA-LVDS)&#xff0c;可以灵活选择最适合LSI所需的幅值水平的输出…

浅谈碳化硅MOSFET TO-247封装单管引入开尔文管脚必要性

相较于传统的硅MOSFET和硅IGBT 产品&#xff0c;基于宽禁带碳化硅材料设计的碳化硅 MOSFET 具有耐压高、导通电阻低&#xff0c;开关损耗小的特点&#xff0c;可降低器件损耗、减小产品尺寸&#xff0c;从而提升系统效率。而在实际应用中&#xff0c;我们发现&#xff1a;带辅助…

外包干了一个月,技术退步明显。。。

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 这次来聊一个大家可能也比较关心的问题&#xff0c;那就是就业城…

Sora的双重边缘:视频生成的革新与就业的再思考

随着科技的日新月异&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;技术如潮水般涌入我们的日常生活&#xff0c;为各个领域带来了翻天覆地的变化。在这一浪潮中&#xff0c;Sora作为一款前沿的AI视频生成工具&#xff0c;凭借其高度逼真…

MindOpt优化器: 浅谈版本0.x和1.x之间API的差异

Mindopt 是一个优化求解器&#xff0c;如果它有两个主要版本——0.xx和1.x.x&#xff08;最新版本1.1.1&#xff09;&#xff0c;它们代表着软件开发的两个不同阶段。版本1.0.0表示软件的一个大的里程碑&#xff0c;代表着软件第一个正式的“成熟”发布版本&#xff0c;而0.25是…

MySQL--优化(索引--索引失效场景)

MySQL–优化&#xff08;索引–索引失效场景&#xff09; 定位慢查询SQL执行计划索引 存储引擎索引底层数据结构聚簇和非聚簇索引索引创建原则索引失效场景 SQL优化经验 常见的索引失效场景 1、场景准备&#xff1a; 给 tb_user 表创建联合索引&#xff0c;字段为&#xff1…

消息队列-Kafka-消费方如何分区与分区重平衡

消费分区 资料来源于网络 消费者订阅的入口&#xff1a;KafkaConsumer#subscribe 消费者消费的入口&#xff1a;KafkaConsumer#poll 处理流程&#xff1a; 对元数据重平衡处理&#xff1a;KafkaConsumer#updateAssignmentMetadataIfNeeded 协调器的拉取处理&#xff1a;onsum…

linux下改变主机名,永久生效的方法

hostnamectl set-hostname test 例子 #支持大写必须就要这样写 hostnamectl set-hostname 名称 --static

缩放算法优化步骤详解

添加链接描述 背景 假设数据存放在在unsigned char* m_pData 里面&#xff0c;宽和高分别是&#xff1a;m_nDataWidth m_nDataHeight 给定缩放比例&#xff1a;fXZoom fYZoom&#xff0c;返回缩放后的unsigned char* dataZoom 这里采用最简单的缩放算法即&#xff1a; 根据比…

代理IP以及动态拨号VPS的关系是什么?

在数字时代&#xff0c;网络安全和隐私保护已成为全球关注的热点话题。代理IP和动态拨号VPS作为提升网络匿名性和安全的重要技术&#xff0c;它们在维护网络隐私中扮演着至关重要的角色。虽然这两种技术在表面上看似相似&#xff0c;实际上它们在功能、应用场景以及用户需求满足…

react + antdesign table组件合并行,展开子表格

假如你有这样的一个数据&#xff1a; [{"bigClass":"吃的","smallClass":"水果","item":"苹果"},{"bigClass":"吃的","smallClass":"水果","item":"香蕉…

这些养老难题,只能靠AI来解决了

3 月 5 日刚召开的两会&#xff0c;AI 这个话题妥妥站上了 C 位。不仅政府工作报告首次提出要开展“人工智能”行动&#xff0c;各路科技大佬和人大代表也是围绕着 AI 大模型的技术创新、应用落地和政策法规&#xff0c;展开了热烈积极的建言献策。甚至有互联网大佬建议将人工智…

创建RAID0,RAID5并管理,热备盘,模拟故障

目录 1. RAID介绍以及mdadm安装 1.1 安装mdadm工具 2. 创建raid0 2.1 环境准备 2.2 使用两个磁盘创建RAID0 2.3 查看RAID0信息 2.4 对创建的RAID0进行格式化并挂载 2.5 设置成开机挂载 2.6 删除RAID0 3. 创建raid5 3.1 环境准备 3.2 用3个磁盘来模拟R…

ERC20学习

ERC20简介 ERC20是一种代币标准&#xff0c;用于创建可替代的代币。 ERC20是在以太坊网络上实现的代币标准&#xff0c;它为数字资产或代币定义了一套规则和接口。这些符合ERC20标准的代币在性质上是完全相同的。即每一个代币都可以被另一个同类型的代币替代&#xff0c;这种属…

社区店选址评估的关键指标:确保商业成功的重要因素

对于想开实体店或创业的人来说&#xff0c;选址是决定商业成功的关键因素之一。作为一名开鲜奶吧5年的创业者&#xff0c;我在网上持续分享开店的干货和见解。 在这篇文章中&#xff0c;我将详细介绍社区店选址评估的关键指标&#xff0c;帮助你确保商业成功。 1、人流量&…

2.DOM-事件基础(注册事件、tab栏切换)(案例:注册、轮播图)

案例 注册事件 <!-- //disabled默认情况用户不能点击 --><input type"button" value"我已阅读用户协议(5)" disabled><script>// 分析&#xff1a;// 1.修改标签中的文字内容// 2.定时器// 3.修改标签的disabled属性// 4.清除定时器// …

如何在Windows上使用Docker,搭建一款实用的个人IT工具箱It- Tools

文章目录 1. 使用Docker本地部署it-tools2. 本地访问it-tools3. 安装cpolar内网穿透4. 固定it-tools公网地址 本篇文章将介绍如何在Windows上使用Docker本地部署IT- Tools&#xff0c;并且同样可以结合cpolar实现公网访问。 在前一篇文章中我们讲解了如何在Linux中使用Docker搭…