zoukankan      html  css  js  c++  java
  • c++ 中lambda

    C++ 11中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作。

    lambda 表达式使用一对方括号作为开始的标识,类似于声明一个函数,只不过这个函数没有名字,也就是一个匿名函数

    Lambda表达式完整的声明格式  

    [capture list] (params list) mutable exception-> return type { function body } 

    各个变量的含义

    1. capture list:捕获外部变量列表
    2. params list:形参列表
    3. mutable指示符:用来说用是否可以修改捕获的变量
    4. exception:异常设定
    5. return type:返回类型
    6. function body:函数体
    [] // 不捕获任何外部变量
    [=]// 以值的形式捕获所有外部变量,[=] 意味着,lambda 表达式以传值的形式捕获同范围内的变量。4.5
    float f0 = 1.0; 
    std::cout << [=](float f) { return f0 + std::abs(f); } (-3.5);
    [&] // 以引用形式捕获所有外部变量,[&] 表明,lambda 表达式以传引用的方式捕获外部变量。
    float f0 = 1.0; 
    cout << [&](float f) { return f0 += std::abs(f); } (-3.5); 
    cout << '
    ' << f0 << '
    ';
    //输出值是 4.5 和 4.5。
    [x, &y] // x 以传值形式捕获,y 以引用形式捕获
    [=, &z]// z 以引用形式捕获,其余变量以传值形式捕获
    [&, x]// x 以值的形式捕获,其余变量以引用形式捕获
    [] {cout << "Hello from Lambda" << endl; } ();//注意:尾部的(),这对括号使得这个lambda表达式立即执行:
    string result = [](const string & str) -> string { return "Hello from " + str; }("second Lambda");
    cout << "Result: " << result << endl;
    Result: Hello from second Lambda  
    //如果我不想让 lambda 表达式自动推断类型,或者是 lambda 表达式的内容很复杂,不能自动推断怎么办?
    //比如,std::abs(float)的返回值是 float,我想把它强制转型为 int。那么,此时,我们就必须显式指定 lambda 
    //表达式返回值的类型
    std::cout << [](float f) -> int { return std::abs(f); } (-3.5);

    注意

    1. 对于[=]或[&]的形式,lambda 表达式可以直接使用 this 指针
    2. 对于[]的形式,如果要使用 this 指针,必须显式传入:[this]() { this->someFunc(); }();

    参考:https://blog.csdn.net/qs9816/article/details/8888366

  • 相关阅读:
    JQuery的ajax函数执行失败,alert函数弹框一闪而过
    ThinkPHP5.1中数据查询使用field方法数组参数起别名时遇到的问题
    Linux Web服务器集群搭建
    三层架构之UI层
    Aircoinst 三层架构ASP.NET开源
    [教程]KALI LINUX 2.0 2019 更新国内源
    工厂模式
    Java 实现序列化和反序列化
    Java实现缓冲流 编码 & 解码
    Java使用IO流读取文件显示到控制台2
  • 原文地址:https://www.cnblogs.com/tianzeng/p/8684062.html
Copyright © 2011-2022 走看看