简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
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传递给它。