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

news2024/11/18 3:02:13

简介: 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传递给它。



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

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

相关文章

Linux基础以及常用命令

目录 1 Linux简介1.1 不同应用领域的主流操作系统1.2 Linux系统版本1.3 Linux安装1.3.1 安装VMWare1.3.2 安装CentOS镜像1.3.3 网卡设置1.3.4 安装SSH连接工具1.3.5 Linux和Windows目录结构对比 2 Linux常用命令2.0 常用命令&#xff08;ls&#xff0c;pwd&#xff0c;cd&#…

LinuxC语言-网络通信tcp/ip errno获取错误描述字符串

目录 服务端代码&#xff1a; 获取errno错误码&#xff1a; 客户端代码&#xff1a; 运行结果: 服务端代码&#xff1a; #include <stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<string.h> #include<netinet/in.h> #in…

在Mac上搭建Gradle环境

在Mac上搭建Gradle环境&#xff1a; 步骤1&#xff1a;下载并安装Java开发工具包&#xff08;JDK&#xff09; Gradle运行需要Java开发工具包&#xff08;JDK&#xff09;。您可以从Oracle官网下载适合您的操作系统版本的JDK。请按照以下步骤进行操作&#xff1a; 打开浏览器…

性能提升,SpringBoot 3.2虚拟线程来了

spring boot 3.2 会提供默认支持&#xff0c;必须Java19。 在以往的项目中&#xff0c;我们面临了这样一种情况&#xff1a;我们收到了数千个认证请求。为了确保安全性&#xff0c;我们依靠第三方系统发送短信 OTP 进行验证。然而&#xff0c;有时候第三方系统花费的时间比预期…

MySQL中锁的简介——表级锁-表锁

1.表级锁简介 2.读锁介绍 lock tables score read;3.写锁介绍 lock tables score write;

html中使用Vue+element UI动态创建表单数据不显示问题

直接上代码&#xff1a;html代码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&…

什么是Class文件规范?

本文重点 前面我们说了JVM就是class的规范实现,那么class规范究竟是什么呢?本文进行详细的介绍 class文件 首先我们需要知道当javac将文件编译为class文件之后,此时的class文件其实是二进制(要么0要么1),但是如果我们将其转变为16进制之后,它的形式就清晰一些,如下所…

RNN架构解析——注意力机制

目录 注意力机制实现 注意力机制 实现

Activity 生命周期

在Android开发中&#xff0c;Activity是应用程序的主要组件之一&#xff0c;它代表应用程序中的一个屏幕或界面。当用户与应用程序进行交互时&#xff0c;Activity会根据用户的操作而启动、暂停、恢复或停止等&#xff0c;这些状态变化被称为Activity的生命周期。 Activity的生…

2023年进阶测试,从接口测试到接口自动化测试总结,一篇彻底打通...

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

Redis(四)—— Redis基本的事务操作、Redis实现乐观锁

一、Redis基本的事务操作 首先声明&#xff1a; redis的单条命令是保证原子性的&#xff08;回想一下setnx k1 v1 k5 v5命令如果k1已经存在&#xff0c;那么k5也会设置失败&#xff09;但是redis的事务不保证原子性&#xff01;见下面“1.2 某条命令有错怎么办&#xff1f;”…

FANUC机器人SRVO-050碰撞检测报警和SRVO-053干扰值过大故障报警总结

FANUC机器人SRVO-050碰撞检测报警和SRVO-053干扰值过大故障报警总结 前面和大家分享了关于SRVO-050碰撞检测报警和SRVO-053干扰值过大的原因分析以及处理方法,感兴趣的朋友可以参考以下链接中的内容: FANUC机器人SRVO-050碰撞检测报警原因分析及处理对策

电子鼻毕业论文

面向压埋探测的人体代谢气体识别方法的研究与应用 实现对非目标气体的检测 数据预处理 &#xff08;1a&#xff09;标准化 将采集到的数据先进行变换&#xff0c;统一数量级。其中&#xff0c;xij为第j个传感器的第i个采样值&#xff1b;xj为第 j 个气体传感器的所有采样值&…

DevOps(三)

CD(二) 1. 整体流程2. 环境准备1. jenkins安装2. 编译安装git3. docker安装4. docker-compose安装5. sonarqube安装6. harbor安装7. gitlab私服8. maven安装9. Nexus部署10. K8s部署3. 安装java及编写代码3.1 安装java3.2 安装IntelliJ IDEA3.3 安装tomcat3.4 安装maven3.5 c…

C++ | 运算符重载

目录 概念 写法 约定俗成 注意事项 概念 其实早在刚开始学习C的时候我们就已经接触到运算符重载了&#xff0c;只是我们当时还没意识到。 std::cout << "Hello World" << std::endl; 对于这一句代码的解释如下&#xff1a; cout其实是一个iostrea…

虚拟机 RHEL8 安装 MySQL 8.0.34

目录 安装步骤一、清除所有残留的旧MySQL二、安装MySQL 报错问题1. 提示未找到匹配的参数&#xff1a; mysql-community-server2. 公钥问题 安装步骤 一、清除所有残留的旧MySQL 1. 关闭MySQL [rootlocalhost /]# service mysqld stop Redirecting to /bin/systemctl stop …

pyspark 笔记 pyspark.sql.function col VS select

0 原始数据 假如我们有这样的一个数据 1 功能上相似 都类似于python的DataFrame中的 df[col_id]&#xff0c;对列取切片的操作 2 区别 使用col之后&#xff0c;可以进行计算&#xff1b;而原版select 则无法进行计算

微服务模式:业务服务模式

无论是单体应用还是微服务&#xff0c;构建企业应用的业务逻辑/服务在更多方面上都有相似之处而不是差异。在两种方法中&#xff0c;都包含服务、实体、仓库等类。然而&#xff0c;也会发现一些明显的区别。在本文中&#xff0c;我将试图以概念性的方式强调这些区别&#xff0c…

Vue2基础二、常用指令

零、文章目录 Vue2基础二、常用指令 1、Vue指令是什么 概念&#xff1a;指令&#xff08;Directives&#xff09;是 Vue 提供的带有 v- 前缀 的 特殊 标签属性。Vue 会根据不同的【指令】&#xff0c;针对标签实现不同的【功能】。**为啥要学&#xff1a;**提高程序员操作 D…

SpringBoot 和 Vue 参数类型不对应,导致method parameter is not present

org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter id for method parameter type String is not present 客户端&#xff1a; requestUserInfoById()const requestUserInfoById async (id?: string) > {} 服务器端&am…