C++之lambda匿名、using、typedef总【全】(二百四十九)

news2024/11/15 21:24:36

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解C++之lambda匿名函数、typedef、using等用法

2.C++之lambda匿名、using、typedef介绍

1.lambda介绍

  • Lambda函数是一种匿名函数,可以在C++中使用。它提供了一种简洁的方式来定义和使用临时的函数对象。Lambda函数通过使用方便的语法来简化函数对象的创建过程,使代码更加简洁和易读。

Lambda函数的基本语法如下:

[capture list] (parameters) -> return_type { function_body }
  • Capture列表:指定Lambda函数所捕获的外部变量。它可以是值捕获(通过值进行拷贝)或引用捕获(通过引用进行访问)的方式。
  • 参数列表:指定Lambda函数的参数。
  • 返回类型:指定Lambda函数的返回类型(可以省略,编译器会自动推断)。
  • 函数体:实现Lambda函数的具体逻辑。

3.lambda匿名、using、typedef介绍

  1. Lambda匿名函数:
    Lambda函数是一种匿名函数,允许我们在需要函数对象的地方定义临时的、即时的函数逻辑。它的语法如下:
[capture list] (parameters) -> return_type { function_body }
  • Capture列表(可选): 指定Lambda函数所捕获的外部变量。
  • 参数列表: 指定Lambda函数的参数。
  • 返回类型(可选): 指定Lambda函数的返回类型。如果不指定,则编译器会自动推断。
  • 函数体: 实现Lambda函数的具体逻辑。

Lambda函数可以用于算法函数、STL容器的处理、回调函数等地方,可以使代码更加简洁和易读。

  1. using声明:
    Using声明在C++中用来引入一个特定的类型或命名空间,以便在当前作用域中使用。它的语法如下:
using name = type;

这里的name是我们定义的别名,type是需要引入的类型。

Using声明可以用来简化复杂的类型名称,或者引入命名空间中的类型。例如:

using IntVector = std::vector<int>;

IntVector numbers = {1, 2, 3, 4, 5};

这里,我们使用了using声明引入了std::vector<int>类型的别名IntVector,从而将其简化为更易读的名称。

  1. typedef声明:
    Typedef声明也是用来引入一个特定的类型别名,以便在当前作用域中使用。它的语法如下:
typedef type name;

这里的type是我们需要引入的类型,name是我们定义的别名。

Typedef声明的作用和using声明类似,它也可以用来简化复杂的类型名称。例如:

typedef std::vector<int> IntVector;

IntVector numbers = {1, 2, 3, 4, 5};

这里,我们使用了typedef声明将std::vector<int>类型定义为IntVector,从而使代码更加易读。

总结:
Lambda函数提供了一种简洁的方式来定义匿名函数,using声明和typedef声明提供了简化类型名称的能力。这些工具可以使代码更加清晰、易读和易于维护。

3.代码实例

#include <iostream>
#include <string>
#include <functional>

typedef std::function<int(int x, int y)> Callback ;
using UCallback = std::function<int(int x, int y)> ;

//v1.0
int call_add(std::function<int(int x, int y)> call){
  int a = 100, b=500;
  call(a, b);//传值a,b给调用者.
  return a+b;
}

//v2.0: 与以上等同:使用typedef定义Callback类型别名定义
int call_add_01(Callback call){
  int a = 100, b=500;
  call(a, b);//传值a,b给调用者.
  return a+b;
}

//v3.0: 与以上等同:使用using定义UCallback类型别名定义
int call_add_02(UCallback call){
  int a = 100, b=500;
  call(a, b);//传值a,b给调用者.
  return a+b;
}

int main() {
  //v1.0:匿名lambda函数,无参数,无返回值.
  [](){
    printf("xxx----->%s(), line = %d\n",__FUNCTION__,__LINE__);
  }();

  //v2.0:匿名lambda函数,带string参数,无返回值.
  [](std::string content){
    printf("xxx----->%s(), line = %d, content = %s\n",__FUNCTION__,__LINE__,content.c_str());
  }("Hello Wolrd.");

  //v3.0:匿名lambda函数,带string和int类型参数,无返回值.
  std::string buf = "Hello, C++!";
  int year = 2023;
  [](std::string buf, int years){
    printf("xxx----->%s(), line = %d, buf = %s, years = %d\n",__FUNCTION__,__LINE__,buf.c_str(), years);
  }(buf, year);

  //4.0: 使用typedef创建别名类型Callback,然后调用回调函数.
  Callback add = [](int a, int b)->int {
    printf("xxx---------->%s(), line = %d, a = %d, b = %d\n",__FUNCTION__,__LINE__,a,b);
    return a + b;
  };
  printf("xxx----->%s(), line = %d, add = %d\n",__FUNCTION__,__LINE__,add(2, 3));

  //v5.0: 使用typedef定义回调函数类型别名
  int ret1 = call_add(add);
  printf("xxx----->%s(), line = %d, ret1 = %d\n",__FUNCTION__,__LINE__,ret1);

  //v6.0: 直接使用lambda匿名回调函数
  int ret2 = call_add([](int x, int y)->int{
    return x + y;
  });
  printf("xxx----->%s(), line = %d, ret2 = %d\n",__FUNCTION__,__LINE__,ret2);

  //v7.0: 使用typedef定义回调函数类型别名
  int ret3 = call_add_01(add);
  printf("xxx----->%s(), line = %d, ret3 = %d\n",__FUNCTION__,__LINE__,ret3);

  //v8.0: 使用using定义回调函数类型别名
  int ret4 = call_add_02(add);
  printf("xxx----->%s(), line = %d, ret4 = %d\n",__FUNCTION__,__LINE__,ret4);

  //v9.0: 直接使用lambda匿名回调函数
  int ret5 = call_add_02([](int x, int y)->int{
    return x + y;
  });
  printf("xxx----->%s(), line = %d, ret5 = %d\n",__FUNCTION__,__LINE__,ret5);

  return 0;
}

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

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

相关文章

如何选择最适合 Android 的 SD 卡恢复软件?

所需要的只是心不在焉地点击了错误的按钮、行为不当的应用程序、或者软件或硬件故障。就这样&#xff0c;您的照片消失了&#xff0c;您的笔记无处可寻&#xff0c;您的文件也消失了。 如何选择最适合 Android 的 SD 卡恢复软件 对别人最好的可能对你不起作用&#xff0c;这取…

【Unity小技巧】可靠的相机抖动及如何同时处理多个震动

每篇一句 围在城里的人想逃出来&#xff0c;站在城外的人想冲进去&#xff0c;婚姻也罢&#xff0c;事业也罢&#xff0c;人生的欲望大都如此。——钱钟书《围城》 前言 相机的抖动我相信大家都不陌生&#xff0c;网上其实已经有非常非常多的教程了&#xff0c;之前我也写过…

2.21每日一题(隐函数求导+变上限积分求导)

1、首先 t 0 时&#xff0c;x ? 或者 y ? 求出来 2、等式两边进行一阶求导&#xff0c;把一阶导函数&#xff08;隐函数求导&#xff09;求出来 3、等式两边再次求导&#xff0c;把二阶导函数&#xff08;隐函数求导&#xff09;求出来 注意&#xff1a;隐函数求导及变上…

Java 枚举类型与泛型-第13章

Java 枚举类型与泛型-第13章 1.枚举类型 枚举类型是一种特殊的数据类型&#xff0c;用于表示一组有限的命名常量。枚举类型可以帮助您更清晰地定义和管理相关常量&#xff0c;并提供类型安全性。 1.1使用枚举类型设置常量 枚举类型是一种非常方便的方式来设置常量。我们可以…

YUV空间-两张图片颜色匹配(颜色替换)

在做颜色匹配时&#xff0c;从RGB转换到YUV也有一些优势。因为YUV把亮度和色彩分开了&#xff0c;所以可以更容易地调整图像的亮度分布和色彩平衡⁴。而且&#xff0c;YUV也更接近人类感知颜色的方式&#xff0c;所以可以更好地保持图像的自然感。 这个公式是用来做颜色匹配的&…

Node.js 的适用场景

目录 ​编辑 前言 适用场景 1. 实时应用 用法 代码 理解 2. API 服务器 用法 代码示例 理解 3. 微服务架构 用法 代码示例 理解 总结 前言 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它使得 JavaScript 可以脱离浏览器运行在服务器…

如何公网远程访问本地WebSocket服务端

本地websocket服务端暴露至公网访问【cpolar内网穿透】 文章目录 本地websocket服务端暴露至公网访问【cpolar内网穿透】1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功…

javaweb+mysql的电子书查阅和下载系统

图书分类查看、热门下载、最新上传、站内数据统计。 登陆注册、图书查询、图书详情、图书下载。 身份分为管理员和用户。 源码下载地址 支持&#xff1a;远程部署/安装/调试、讲解、二次开发/修改/定制

【JavaSE】注释\标识符\关键字\字面常量\数据类型与变量

下面直接介绍Java的基础知识点&#xff0c;很多与C语言相似&#xff0c;但是也有很多不一样的点 目录 一、注释 二、标识符与关键字 1.标识符 2.关键字 三、字面常量 四、数据类型与变量 1.数据类型 2.变量 3.不同类型的变量 4.类型转换与类型提升 5.字符串类型 一…

[减脂期食谱] 自制千岛酱

[减脂期食谱] 自制千岛酱 成品如下&#xff1a; 最中间的那个&#xff0c;算比较居中的颜色吧&#xff0c;其实自己家做原版的千岛酱还是比较简单的&#xff0c;它的底就是蛋黄酱(蛋黄油乳化的酱)&#xff0c;随后里面的材料比较自由&#xff0c;维基百科是这么介绍的&#xf…

『C++成长记』C++入门—— 函数重载引用

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;C &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、函数重载 &#x1f4d2;1.1函数重载的概念 &#x1f4d2;1.2函数重载的种类 …

【密评】商用密码应用安全性评估从业人员考核题库(十五)

商用密码应用安全性评估从业人员考核题库&#xff08;十五&#xff09; 国密局给的参考题库5000道只是基础题&#xff0c;后续更新完5000还会继续更其他高质量题库&#xff0c;持续学习&#xff0c;共同进步。 3501 单项选择题 根据GM/T 0115 《信息系统密码应用测评要求》&am…

基于人机环境系统的新全局工作空间理论

&#xff08;旧的&#xff09;全局工作空间理论是由心理学家伯纳德巴尔斯&#xff08;Bernard Baars&#xff09;提出的一种关于意识的理论。该理论认为&#xff0c;意识是一种全局性的心理状态&#xff0c;其中包含了我们当前的感知、思维和意识内容。根据全局工作空间理论&am…

【Python从入门到进阶】40、requests的基本使用

接上篇《39、使用Selenium自动验证滑块登录》 上一篇我们介绍了使用selenium进行滑块自动验证操作。本篇我们结束selenium的章节&#xff0c;来学习requests库的基本使用。 一、requests与urllib的爱恨情仇 1、requests与urllib的区别 大家在前面的学习中&#xff0c;访问网…

2.23每日一题(反常积分收敛性的判断)

解法一&#xff1a;用定义&#xff08;当被积函数的原函数比较好找时&#xff09;&#xff1a; 积分结果为存在则收敛&#xff0c;不存在则发散。 解法二&#xff1a;通过p积分的比较法判断敛散性&#xff1a; 即被积函数与p积分相比较&#xff0c;使得两者同敛散&#xff1b;再…

轻量封装WebGPU渲染系统示例<3>-纹理立方体(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/version-1.01/src/voxgpu/sample/ImgTexturedCube.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据和渲染机制分离。 5…

算法通过村第十七关-贪心|黄金笔记|跳跃游戏

文章目录 前言跳跃游戏最短跳跃游戏总结 前言 提示&#xff1a;曾走过山&#xff0c;走过水&#xff0c;其实只是借助他们走过我的生命&#xff1b;我看着天&#xff0c;看着地&#xff0c;其实只是借助它们确定我的位置&#xff1b;我爱这她&#xff0c;爱着你&#xff0c;其实…

【Java】基于微服务架构的智慧工地监管云平台源码带APP

前言&#xff1a;智慧工地监管平台是一种利用物联网、云计算、大数据等技术手段实现工地信息化管理的解决方案。它通过数据采集、分析和应用&#xff0c;在实时监控、风险预警、资源调度等方面为工地管理者提供了全方位的支持&#xff0c;提高了工地管理的效率和质量。智慧监管…

数据结构OJ题

目录 1.字符串左旋 2.字符串旋转结果 3.旋转数组 4.移除元素 本篇主要是讲解一些OJ题目。 1.字符串左旋 字符串左旋 实现一个函数&#xff0c;可以左旋字符串中的k个字符 例如&#xff1a; ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 方法1【暴力求解】 翻转1…

Mybatis @MapKey注解返回指定Map源码解析与用例

文章目录 前言技术积累什么是MyBatisMapKey注解 用例展示MapKey注解源码解析写在最后 前言 最近在开发的一个业务功能需要从一批数据中根据业务字段提取数据&#xff0c;对于这个需求可能有的同学就直接用for或者stream循环的方式进行处理了。但是&#xff0c;作为一个资深的搬…