简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
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介绍
- Lambda匿名函数:
Lambda函数是一种匿名函数,允许我们在需要函数对象的地方定义临时的、即时的函数逻辑。它的语法如下:
[capture list] (parameters) -> return_type { function_body }
- Capture列表(可选): 指定Lambda函数所捕获的外部变量。
- 参数列表: 指定Lambda函数的参数。
- 返回类型(可选): 指定Lambda函数的返回类型。如果不指定,则编译器会自动推断。
- 函数体: 实现Lambda函数的具体逻辑。
Lambda函数可以用于算法函数、STL容器的处理、回调函数等地方,可以使代码更加简洁和易读。
- 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
,从而将其简化为更易读的名称。
- 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;
}