C++[第二十九章]--lambda匿名函数

文章介绍了C++中的lambda表达式,包括其基本语法结构,如[]用于捕获外部变量,(参数)定义函数参数,->返回值类型指定返回类型。还讨论了不同的捕获方式,如值捕获、引用捕获以及默认捕获。同时,提到了lambda函数与std::function和bind的结合使用。
摘要由CSDN通过智能技术生成

lambda匿名函数

1、使用:

[外部变量访问方式说明符] (参数) mutable noexcept/throw() -> 返回值类型
{
   函数体;
};

[外部变量方位方式说明符] :[ ] 方括号用于向编译器表明当前是一个 lambda 表达式,其不能被省略,通过捕获列表来确定匿名函数调用时使用哪些外部变量。

(参数):和普通函数的定义一样,lambda 匿名函数也可以接收外部传递的多个参数。和普通函数不同的是,如果不需要传递参数,可以连同 () 小括号一起省略

mutable:此关键字可以省略,如果使用则之前的 () 小括号将不能省略(参数个数可以为 0)

noexcept/throw():可以省略,如果使用,在之前的 () 小括号将不能省略(参数个数可以为 0)

-> 返回值类型:指明 lambda 匿名函数的返回值类型。值得一提的是,如果 lambda 函数体内只有一个 return 语句,或者该函数返回 void,则编译器可以自行推断出返回值类型,此情况下可以直接省略-> 返回值类型

函数体:

例子:

class Test
{
public:
    void output(int x, int y)
    {
        auto x1 = [] {return m_number; }; // error
        auto x2 = [=] {return m_number + x + y; }; // ok
        auto x3 = [&] {return m_number + x + y; }; // ok
        auto x4 = [this] {return m_number; }; // ok
        auto x5 = [this] {return m_number + x + y; }; // error
        auto x6 = [this, x, y] {return m_number + x + y; }; // ok
        auto x7 = [this] {return m_number++; }; // ok
    }
    int m_number = 100;
};
int main() {
    return 0;
}

[]里面捕捉的是作用域内的东西。
()里面是参数,下次调用函数时传入。
、、、cpp
int main(void)
{
// 包装可调用函数 function<返回值(函数列表)>
int x = 10;
std::function<int(int)> f1 = [=](int a) {return a+x; };
// 绑定可调用函数 std::placeholders是一个占位符 bind(函数,参数1,参数2);
std::function<int(int)> f2 = bind([](int a) {return a; }, placeholders::_1);

// 函数调用
cout << f1(100) << endl;
cout << f2(200) << endl;
return 0;

}
、、、

2、参数说明

捕获形式 说明
[] 不捕获任何外部变量(注意,可以使用全局变量和静态变量)
[a, b…] 默认以值得形式捕获指定的多个外部变量(用逗号分隔),如果引用捕获,需要显示声明(使用&说明符)
[this] 以值的形式捕获this指针
[=] 以值的形式捕获所有外部变量(包括lambda所在类的this)
[&] 以引用形式捕获所有外部变量(同上)
[=, &x] 变量x以引用形式捕获,其余变量以传值形式捕获
[&, x] 变量x以值的形式捕获,其余变量以引用形式捕获

例子:

#include <iostream>
#include <functional>
using namespace std;

#if 0
int main(void)
{
    // 包装可调用函数  function<返回值(函数列表)>
    int x = 10;
    std::function<int(int)> f1 = [=](int a) {return a+x; };
    // 绑定可调用函数 std::placeholders是一个占位符  bind(函数,参数1,参数2);
    std::function<int(int)> f2 = bind([](int a) {return a; }, placeholders::_1);

    // 函数调用
    cout << f1(100) << endl;
    cout << f2(200) << endl;
    return 0;
}
#endif


int add(int x, int y)
{
    return x+y;
}

int test(int a,int b, int *fun(int ,int))
{
    return *fun(a,b);
}

int main(void)
{

    int  a =1,b=2;
    int  c = add(a,b);

    auto addL = [] (int x,int y){
        return x+y;
    };

    int d = addL(a,b);

    test(a,b,add);

    cout << c << endl;
    cout << d << endl;


    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

起风就扬帆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值