C11中引入了Lambda表达式,Lambda表达式是一种匿名函数,它可以在需要函数的地方直接定义和使用,而无需显式地定义一个函数。
lambda表达式
Lambda表达式语法定义
[capture-list](parameters) -> return-type { statement }
capture-list是:用来捕获外部变量的列表
parameters是:函数的参数列表
return-type是:返回值类型
statement是:函数体
关于capture-list的几种形式
[]:空的capture-list,不捕获任何外部变量
[var]:捕获单个变量,通过值进行捕获
[&var]:捕获单个变量,通过引用进行捕获
[=]:通过值捕获所有外部变量
[&]:通过引用捕获所有外部变量
[this]:以值方式捕获当前对象的指针(指向当前类对象的指针,在成员函数内使用, 使得在lambda函数内部访问成员变量和成员函数成为可能)
这些形式可以组合使用,用逗号分隔。例如,[x, &y]表示通过值捕获变量x,通过引用捕获变量y。
Lambda表达式的优缺点
优点
- 可以直接在需要调用函数的位置定义短小精悍的函数,而不需要预先定义好函数
- 使用Lamdba表达式变得更加紧凑,结构层次更加明显、代码可读性更好
缺点
- Lamdba表达式语法比较灵活,增加了阅读代码的难度;
- 对于函数复用无能为力;
Lambda表达式和shared_from_this()
Lambda表达式和shared_from_this()是C++中两个不同的概念,它们在一些情况下可以结合使用。
Lambda表达式可以在代码中直接定义匿名的、可调用的函数。Lambda函数可以捕获外部变量,并且可以使用[]语法来指定捕获方式。Lambda表达式常用于替代传统的函数对象或函数指针。
shared_from_this()是一个成员函数,它位于一个继承自std::enable_shared_from_this的类中。它的作用是返回一个std::shared_ptr,该智能指针可以安全地管理当前对象的生命周期。
这两个概念的关系在于,当我们需要在Lambda表达式中访问当前对象(即Lambda表达式所在的类的实例)时,可以使用shared_from_this()来获取指向当前对象的std::shared_ptr。这样可以保证在Lambda表达式执行期间,当前对象不会意外地被销毁,从而避免悬空指针的问题。
需要注意的是,使用shared_from_this()必须满足两个条件:
- 对象必须通过std::shared_ptr来管理其生命周期。
- 调用shared_from_this()的代码必须在对象生命周期内,即不能在对象已经被释放后调用shared_from_this()。
总结起来,Lambda表达式和shared_from_this()可以结合使用,以确保在Lambda表达式中安全地访问当前对象。
#include <memory>
#include <iostream>
class A : public std::enable_shared_from_this<A> {
public:
void someFunction() {
std::cout << "Calling someFunction() in class A" << std::endl;
// 使用Lambda表达式调用另一个函数
auto lambda = [shared_this = shared_from_this()]() {
std::cout << "Calling lambda function" << std::endl;
shared_this->anotherFunction(); // 调用类A中的另一个函数
};
lambda();
}
void anotherFunction() {
std::cout << "Calling anotherFunction() in class A" << std::endl;
}
};
class B {
public:
void doSomething() {
std::cout << "Calling doSomething() in class B" << std::endl;
// 创建类A的智能指针并调用其中的函数
std::shared_ptr<A> a = std::make_shared<A>();
a->someFunction();
}
};
int main() {
B b;
b.doSomething();
return 0;
}