C++之lambda表达式/function/using/typedef用法总结(一百六十六)

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

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

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

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

欢迎关注Android系统攻城狮

1.前言

本篇目的:lambda表达式/function/using/typedef用法总结

2.应用实例

<1>.lambda表达式/function/using/typedef实例集合

#include <iostream>
#include <functional>
#include <string>
#include <vector>
#include <cstring>
using namespace std;

void interfaceDescriptor(std::function<void(const std::string& descriptor)> _hidl_cb){
  _hidl_cb("android.frameworks.cameraservice.service@2.2::ICameraService");
}

int test(const std::string& desc){
  std::cout << "xxx------>" << __FUNCTION__ << "(), line = " << __LINE__ << ", desc_name = " << desc << std::endl;
  return 0;
}

void print_cb(std::function<void (const std::string& descriptor)> cb){
  cb("11111111111");
}

int main() {
  //v1.0 普通回调方式
  //interfaceDescriptor(test);

  int status = 10;
  std::string buf = "Hello World";
  //v2.0 lambda表达式回调(本质:将"数据勾出来");引用传递变量:status和buf.
  interfaceDescriptor([&status, &buf](const std::string& desc)->void {
    printf("xxx------>%s(), line = %d, desc_name = %s\n",__FUNCTION__,__LINE__, desc.c_str());
    printf("xxx------>%s(), line = %d, buf = %s\n",__FUNCTION__,__LINE__, buf.c_str());

    //将desc复制到buf中.
    //buf =desc; //way 1
    //or
    buf.assign(desc); //way 2
  });

  //打印buf的内容,是否复制成功.
  printf("xxx------>%s(), line = %d, buf = %s\n",__FUNCTION__,__LINE__, buf.c_str());


  //v3.0: using定义类型函数指针类型别名
  using UD = std::function<void(const string& descriptor)>;
  UD id_cb = test;
  id_cb("Use 'using' define alias name.");

  //v4.0:typedef定义类型函数指针类型别名
  typedef std::function<void(const string& descriptor)> TD;
  TD td_cb = test;
  td_cb("Use 'typedef' define alias name.");

  //v5.0:不用typedef和using定义别名.
  print_cb(test);


  //v6.0 lambda表达式使用auto定义类型.
  int bb = 30;
  auto FuncAdd = [&bb](int a, int b)->int {
    printf("xxx---------->%s(), line = %d, a = %d, b = %d, bb = %d\n",__FUNCTION__,__LINE__,a,b,bb);
    return a + b;
  };

  FuncAdd(10, 20);

  //v7.0不使用auto,使用function接收lamdbda表达式
  int aa = 30;
  std::function<int(int, int)> func_test = [&aa](int a, int b) -> int {//lambda表达式是一个闭包,std::function可以捕获局部变量,其中[&aa] 指示了需要将外部变量 aa 通过引用进行捕获.
    printf("xxx---------->%s(), line = %d, a = %d, b = %d, aa = %d\n",__FUNCTION__,__LINE__,a,b,aa);
    return a + b + aa;
  };
  func_test(13, 10);

  //v8.0使用typedef接收lamdbda表达式
  //int bb8 = 30;
  typedef int (*FuncAddType)(int, int);  // 定义FuncAdd的函数类型别名

  //FuncAddType func_08 = [&bb8](int a, int b)->int {//错误:函数指针类型不支持捕获上下文bb8,因为它只表示一个指向函数的指针,因此,在定义函数指针时不能直接将捕获的上下文bb8传递给它。
  FuncAddType func_08 = [](int a, int b)->int{
    printf("xxx---------->%s(), line = %d, a = %d, b = %d\n",__FUNCTION__,__LINE__,a,b);
    return a + b ;
  };

  func_08(100,200);


  //v9.0使用using接收lamdbda表达式
  using FuncAddTest = int(*)(int, int);  // 定义FuncAdd的函数指针类型
  FuncAddTest func_09 = [](int a, int b) -> int {
    printf("xxx---------->%s(), line = %d, a = %d, b = %d\n",__FUNCTION__,__LINE__,a,b);
    return a + b;
  };
  func_09(300,500);

  return 0;
}


<2>.总结

1.function关键字回调函数定义解释:
例子:
   std::function<void(const std::string& descriptor);
   void:表示函数指针返回值类型.
   const std::string:参数类型.
例子:
 std::function<int(int, int)> func_test = [&aa](int a, int b) -> int {}//正确
原因:
lambda表达式是一个闭包,std::function可以捕获局部变量,其中[&aa] 指示了需要将外部变量 aa 通过引用进行捕获.

2.C++ lambda表达式
例子:
   interfaceDescriptor([&status, &buf](const std::string& desc)->void {}
   通用公式:[]:()->void{}
   [&status, &buf]:表示传入的参数;
   本质上传入的status和buf是要把回调函数的实际实现的变量,赋值给status和buf,把他们传出来使用,可以把回调函数比作“钩子函数”(hook),就是要把数据勾出来。
   (const std::string& desc):表示回调函数定义的时候的参数类型,也是为了获取回调函数勾出来数据。
	这里表示
   ->void:返回类型是void;
   {}:表示函数处理的逻辑.

3.using定义类型别名 通用格式
 using 别名 = 真名;

4.typedef定义类型别名 通用格式
 typedef 真名 别名;
typedef int (*FuncAddType)(int, int);  
FuncAddType func_08 = [&bb8](int a, int b)->int {}//错误:
原因:
typedef仅仅是为了给一个类型定义一个别名,对于函数指针类型的定义也是一样的。
函数指针类型不支持捕获上下文bb8,因为它只表示一个指向函数的指针,因此,在定义函数指针时不能直接将捕获的上下文bb8传递给它。



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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件设计师学习第一章

计算机组成与体系结构&#xff08;6分&#xff09; 内容概述 数据的表示 进制转换 R 进制转十进制使用按权展开法&#xff0c;其具体操作方式为&#xff1a;将 R 进制数的每一位数值用 Rk 形示&#xff0c;即幂的底数是 R &#xff0c;指数为 k &#xff0c; k 与该位和小数点…

惠普HP Color Laser 150a开机红色感叹号闪烁不打印故障解决方法

故障描述&#xff1a; 惠普HP Color Laser 150a开机红色感叹号闪烁&#xff0c;不能打印&#xff0c;电脑提示C3-6140。 检测分析&#xff1a; 在解决C3-6140错误代码之前&#xff0c;我们需要先检查打印机是否连接正常。如果打印机连接不正常&#xff0c;也可能会出现这个错误…

2、HAproxy调度算法

HAProxy的调度算法可以大致分为以下几大类&#xff1a; 静态算法&#xff1a;这类算法的调度策略在配置时就已经确定&#xff0c;并且不会随着负载的变化而改变。常见的静态算法有&#xff1a; Round Robin(轮询) Least Connections(最少连接数) Static-Weight(静态权重) Sourc…

总结 Android 开发中截取字符串的方法

string str”hello word”;int i5; 1 取字符串的前i个字符 strstr.Substring(0,i); // or strstr.Remove(i,str.Length-i);substring(start,end)&#xff1a;substring是截取2个位置之间及start-end之间的字符串2 去掉字符串的前i个字符&#xff1a; strstr.Remove(0,i); // or…

LabVIEW开发谐振器陀螺仪仿真系统

LabVIEW开发谐振器陀螺仪仿真系统 陀螺仪是INS系统中最重要的传感器。它们的性能&#xff08;如精度和偏置稳定性&#xff09;决定了INS系统的水平。陀螺仪按原理分为三类&#xff1a;角动量守恒、萨格纳克效应和科里奥利效应。旋转坐标系中的移动物体受到的力与旋转坐标系的角…

flutter:角标

角标应该非常常见了&#xff0c;以小说app为例&#xff0c;通常会在小说封面的右上角上显示当前未读的章数。 badges 简介 Flutter的badges库是一个用于创建徽章组件的开源库。它提供了简单易用的API&#xff0c;使开发者可以轻松地在Flutter应用程序中添加徽章效果。 官方文…

chatGPT 学习分享:内含PPT分享下载

InstructGPT论文地址&#xff1a; Training language models to follow instructions with human feedbackchatGPT地址&#xff1a;openAI个人整理的PPT&#xff08;可编辑&#xff09;&#xff0c;下载地址&#xff1a;chatGPT学习分享PPT

windows环境下,安装elasticsearch

jdk ElasticSearch是基于lucence开发的&#xff0c;也就是运行需要java jdk支持。 我下载了 elasticsearch-8.9.0-windows-x86_64.zip&#xff0c;带了OpenJDK。 ElasticSearch下载 https://www.elastic.co/downloads/elasticsearch 安装ElasticSearch 下载安装包后解压 修…

AI Chat 设计模式:9. 命令模式

本文是该系列的第九篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的一些思考和补充。 问题列表 Q.1 介绍下命令模式A.1Q.2 详细说说命令模式适用于啥场景呢A.2Q.3 举一个命令模式的例子&a…

pandas处理什么样的数据?

Pandas 是一个开源的第三方 Python 库&#xff0c;从 Numpy 和 Matplotlib 的基础上构建而来&#xff0c;享有数据分析“三剑客之一”的盛名&#xff08;NumPy、Matplotlib、Pandas&#xff09;。Pandas 已经成为 Python 数据分析的必备高级工具&#xff0c;它的目标是成为强大…

前端工作中常用 CSS 知识点整理

1.1文字溢出省略号 文字单行溢出: overflow: hidden; // 溢出隐藏 text-overflow: ellipsis; // 溢出用省略号显示 white-space: nowrap; // 规定段落中的文本不进行换行 多行文字溢出: overflow: hidden; // 溢出隐藏 text-overflow: …

几百本常用计算机开发语言电子书链接

GitHub - XiangLinPro/IT_book: 本项目收藏这些年来看过或者听过的一些不错的常用的上千本书籍&#xff0c;没准你想找的书就在这里呢&#xff0c;包含了互联网行业大多数书籍和面试经验题目等等。有人工智能系列&#xff08;常用深度学习框架TensorFlow、pytorch、keras。NLP、…

【已解决】React Antd Form.List 表单校验无飘红提示的问题

背景 我想对 Form.List 构建的表单进行校验&#xff0c;比如下拉框中的内容应当至少有一个 XX&#xff0c;表单的长度不能少于多少等等对 List 内容进行校验&#xff0c;并给出飘红提示 问题 比如我有这样一段代码来实现对 list 具体内容的校验&#xff0c;但是写完后发现没有…

MySQL-多表查询-案例1

案例 根据需求完成多表查询的SQL语句的编写将资料汇中准备好的数据的SQL脚本导入到数据库中准备数据中各表的关系如下 具体代码 -- 分类表 create table category(id int unsigned primary key auto_increment comment 主键ID,name varchar(20) not null unique comment 分类名…

华为HCIP第二节-------------------------ISIS

IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是ISO &#xff08;International Organization for Standardization&#xff0c;国际标准化组织&#xff09;为它的CLNP&#xff08;ConnectionLessNetwork Protocol&…

WGCLOUD - v3.4.7开始访问地址不用加/wgcloud了

WGCLOUD在v3.4.7版本更新中说明&#xff0c;从v3.4.7版本开始&#xff0c;访问server页面&#xff0c;不用在URL加/wgcloud了 只需要IP和端口就可以了&#xff0c;如&#xff1a;http://localhost:9999

c++网络编程

网络编程模型 c/s 模型&#xff1a;客户端服务器模型b/s 模型&#xff1a;浏览器服务器模型1.tcp网络流程 服务器流程&#xff1a; 1.创建套接字2.完善服务器网络信息结构体3.绑定服务器网络信息结构体4.让服务器处于监听状态5.accept阻塞等待客户端连接信号6.收发数据7.关闭套…

使用EasyPoi实现Excel的按模板样式导出

模板文件 1690342020350导出测试.xlsx 导出文件 如下 1&#xff0c;横向遍历 #fe 使用#fe命令可以实现集合数据的横向拓展&#xff0c;比如模板代码是 {{#fe:maths t.score}}导出的excel里面就会显示会自当前列&#xff0c;向右拓展&#xff0c;效果可参见下面的导出文件…

Retrospectives on the Embodied AI Workshop(嵌入式人工智能研讨会回顾) 论文阅读

论文信息 题目&#xff1a;Retrospectives on the Embodied AI Workshop 作者&#xff1a;Matt Deitke, Dhruv Batra, Yonatan Bisk 来源&#xff1a;arXiv 论文地址&#xff1a;https://arxiv.org/pdf/2210.06849 Abstract 我们的分析重点关注 CVPR Embodied AI Workshop 上…

【LeetCode】114.二叉树展开为链表

题目 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。 示例 1&…