简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
🍉🍉🍉文章目录🍉🍉🍉
- 🌻1.前言
- 🌻2.Lambda函数与std::bind介绍
- 🌻3.代码实例
- 🐓3.1 Lambda函数示例
- 🐓3.2 std::bind函数示例
- 🐓3.3 Lambda函数和std::bind结合使用的示例
🌻1.前言
本篇目的:C++之lambda函数与std::bind区别及用法实例
🌻2.Lambda函数与std::bind介绍
- C++11引入了lambda表达式,这是一种方便快捷的方式来创建匿名函数对象。Lambda函数在C++中非常有用,特别是在需要传递简短的函数作为算法的参数时,例如在std::sort或std::find_if等算法中。Lambda函数可以有参数,并且可以包含一个表达式或者一个花括号内的一系列语句。
- Lambda函数的基本语法如下:
[捕获列表](参数列表) mutable -> 返回类型 {
// 函数体
}
- 捕获列表用于指定lambda函数如何从外部环境捕获变量。
- 参数列表定义了函数的参数。
- mutable修饰符允许在lambda函数中修改通过值捕获的变量。
- 返回类型可以使用auto推断,或者显式指定。
- 函数体由花括号包围,可以是单个表达式或者多条语句。
- 例如,一个lambda函数,接受两个整数参数并返回它们的和:
auto add = [](int a, int b) -> int { return a + b; };
- std::bind函数用于绑定一个可调用对象(如函数、成员函数、Lambda表达式等)到一个或多个参数。这使得你可以创建一个新的可调用对象,该对象在调用时会使用绑定参数。std::bind常用于回调函数和函数对象,当你需要以特定参数列表调用一个函数,但是又不希望直接传递所有的参数时。
- std::bind的基本语法如下:
std::bind(可调用对象, 参数列表)
-
可调用对象是要绑定的函数或Lambda表达式。
-
参数列表是要传递给可调用对象的参数。
-
Lambda函数与std::bind的主要区别在于:
- Lambda表达式创建的是一个匿名函数对象,它可以独立使用,而std::bind返回的是一个新的可调用对象,它依赖于原始的可调用对象。
- Lambda表达式可以直接作为函数参数传递,而std::bind通常用于绑定成员函数,并且需要指定对象实例。
- Lambda表达式可以有返回类型,而std::bind返回的类型的确切形式取决于被绑定函数的返回类型和参数类型。
- 总结来说,Lambda表达式和std::bind都是C++11中引入的有用特性,它们提供了不同的方式来创建和使用匿名函数。Lambda表达式适用于需要一个简单的匿名函数对象的场景,而std::bind适用于需要将函数绑定到特定参数列表并创建一个新的可调用对象的场景。
🌻3.代码实例
🐓3.1 Lambda函数示例
#include <iostream>
int main() {
// 一个lambda函数,接受两个整数参数并返回它们的和
auto add = [](int a, int b) -> int { return a + b; };
// 使用lambda函数
std::cout << add(10, 20) << std::endl; // 输出30
// 一个捕获外部变量的lambda函数
auto multiply = [x = 10](int y) -> int { return x * y; };
std::cout << multiply(20) << std::endl; // 输出200
return 0;
}
🐓3.2 std::bind函数示例
#include <iostream>
#include <functional>
class MyClass {
public:
void myFunction(int a, int b) {
std::cout << a + b << std::endl;
}
};
int main() {
MyClass obj;
// 使用std::bind绑定成员函数
auto boundFunction = std::bind(&MyClass::myFunction, &obj, 10, 20);
boundFunction(); // 输出30
return 0;
}
🐓3.3 Lambda函数和std::bind结合使用的示例
#include <iostream>
#include <functional>
class MyClass {
public:
void operator()(int a, int b) {
std::cout << a + b << std::endl;
}
};
int main() {
MyClass obj;
// 使用lambda函数作为参数传递给成员函数
auto memberLambda = [&obj](int a, int b) { obj(a, b); };
// 使用std::bind将成员lambda函数绑定到成员函数
auto boundMemberLambda = std::bind(memberLambda, 10, 20);
boundMemberLambda(); // 输出30
return 0;
}