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

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

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

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

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

欢迎关注Android系统攻城狮

1.前言

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

2.应用实例

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

#include 
#include 
#include 
#include 
#include 
using namespace std;

void interfaceDescriptor(std::function<void(const std::string& descriptor)> _hidl_cb){
  _hidl_cb("[email protected]::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传递给它。



你可能感兴趣的:(C++入门系列,c++,开发语言)