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;包括直播转码、直播录制、直播截图、直播审核、智能鉴黄、实时监播、移动直…

libass分析6-源码分析-ASS_Renderer结构体分析,ass文件数据是如何存放的

Author: wencoo Blog&#xff1a;https://wencoo.blog.csdn.net/ Date: 01/03/2024 Email: jianwen056aliyun.com Wechat&#xff1a;wencoo824 QQ&#xff1a;1419440391 Details:文章目录 目录正文 或 背景 ASS_Renderer结构体原型ASS_FontSelector结构体原型ASS_FontInfo结构…

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

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

Java必须掌握的权限修饰符和代码块(含知识点和源码)

在Java中&#xff0c;权限修饰符&#xff08;Access Modifiers&#xff09;和代码块&#xff08;Code Blocks&#xff09;是两个基本但重要的概念&#xff0c;经常会在面试中被提及。理解这些概念对于编写安全和高效的代码至关重要。 Java权限修饰符 权限修饰符定义了Java类中…

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

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

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

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

单例九品--第二品

单例九品--第二品 第一品回顾写在前边代码部分实现方式评注与思考下一品设计的思考 第一品回顾 第一品传送门 第一品的实现方式完全没有阻止构建类的多个对象&#xff0c;在这一品中将会修复这种问题。 写在前边 基本思路 • 将构造、析构函数设置为私有成员 • 使用静态成员…

ES: ES+Kibana 环境部署

ESKibana 部署 机器信息 10.10.8.62 10.10.8.63 10.10.8.64版本选择&#xff1a;6.8.1 基础环境优化 所有节点 # 关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld.service# 查看selinux getenforce # 关闭selinux setenforce 0 # 永久关闭se…

取证工作:如何解锁受密码保护的 SQL Server 数据库并重置密码?

Advanced SQL Password Recovery 是 Elcomsoft 取证工具包中的密码破解软件之一。该软件可以即时访问受密码保护的 SQL Server 数据库。更改以 Microsoft SQL Server 格式保护数据库的任何用户或管理密码。 即时重置密码以保护 Microsoft SQL Server 数据库任何语言和编码的密…

浅谈碳化硅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…

SSR和CSR

SSR&#xff1a;服务端渲染&#xff08;Server-Side Rendering&#xff09; 浏览器每次请求时&#xff0c;服务端都会生成页面完整的HTML响应&#xff0c;最后在浏览器将静态的HTML“激活”。 CSR&#xff1a;客户端渲染&#xff08;Client-Side Rendering&#xff09; 首次…

消息队列-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; 根据比…

每天一个数据分析题(一百九十五)

关于用户标签的分类&#xff0c;下列哪些说法是正确的&#xff1f; A. 属性标签主要包括用户的个人信息&#xff0c;如性别和出生日期&#xff0c;这些数据虽无因果关系&#xff0c;但可以用于预测用户行为。 B. 状态标签反映的是用户的社会经济状态和社会资本&#xff0c;如…

PostgreSQL教程(二十四):服务器管理(六)之数据库角色

PostgreSQL使用角色的概念管理数据库访问权限。一个角色可以被看成是一个数据库用户或者是一个数据库用户组&#xff0c;这取决于角色被怎样设置。角色可以拥有数据库对象&#xff08;例如&#xff0c;表和函数&#xff09;并且能够把那些对象上的权限赋予给其他角色来控制谁能…