c/c++:lambda表达式

File : lambda.cpp
Type : c++
Brief : c++ lambda简单用法


#include <iostream>
#include <functional>
using std::cout;
using std::endl;

/*
 * 基本用法
 * [] () mutable ->type {}
 * -- -- ------- ------ --
 *  1  2   3      4      5
 *
 *  1: 捕获值列表
 *  2: 传入参数列表
 *  3: 可修改标示符
 *  4: 返回值
 *  5: 函数体
 *
 * []     : 不捕获
 * [&]    : 按引用捕获作用域中的所有变量
 * [=]    : 按值捕获作用域中的所有变量
 * [=,&n] : n按引用捕获,其它变量按值捕获
 * [m,&n] : m按值捕获,n按引用捕获
 * [this] : 捕获当前类中this指针
 */

struct Num
{
    int num;
    std::function<int()> func;

    Num(int n) : num(n)
    {
        this->func = [this]()->int{std::cout << "num: " << this->num; return this->num;};
    }
};

int main()
{
    // 简单示例
    int xy =  [](int x, int y)->int{return x+y;} (4,5);
    auto add = [&xy](int a)->int{xy += a; return xy;};
    cout << "xy: " << xy << endl;
    add(1);
    cout << "xy++: " << xy << endl;

    // 有mutable参数或都->type时,()不可省略
    int m = 0, n = 0;
    // m为按值捕获,若要修改m,需要加mutable
    auto f1 = [m] () mutable ->int {return ++m;};
    auto f2 = [&m] () ->int {return ++m;};
    auto f3 = [=] () mutable {n ++; return ++m;};

    cout << "f1: " << f1() << endl;     // 将f1看成一个类对象,成员变量为f1.m
    cout << "f1: " << f1() << endl;     // 在定义f1时所捕获的m,即为f1.m的初始值
    cout << "f1: " << f1() << endl;     // 连续调用3次f1(),即m自增3次
    cout << "m: " << m << endl;

    cout << "f2: " << f2() << endl;
    cout << "f2: " << f2() << endl;
    cout << "m: " << m << endl;

    cout << "f3: " << f3() << endl;
    cout << "m: " << m << endl;

    // 使用function对象
    std::function<int(double)> plus = [](double a)->int{return (int)a;};
    cout << "plus: " << plus(2.33) << endl;
    Num num(9);
    num.func();
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 [ yehuohan@gmail.com ]

文章标题:c/c++:lambda表达式

本文作者:Y

发布时间:2018-01-18, 15:46:56

最后更新:2019-05-21, 20:06:10

原始链接:http://yehuohan.github.io/2018/01/18/Gist/c&c++/c-lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。