`

c++ lamda 函数

    博客分类:
  • c++
 
阅读更多
// lamda.h
#include<iostream>
#pragma once
using namespace std;
void funcExt();
class Lamb
{
private:
    int aa =20;
    int bb =30;
public:
    Lamb();
    ~Lamb();
    void show();
    void f()
    {
        auto fun10 = [this]()
        {
            this->show();
        };
        fun10();
    }
};

 

//lamda_ext.cpp
#include "lamda.h"
auto func =[]()
{
    cout<<"funcExt result."<<endl;
};
void funcExt()
{
    func();
}
Lamb::Lamb() {};
Lamb::~Lamb() {};
void Lamb::show()
{
    cout<<aa+bb<<endl;
}

 

//lamda.cpp
#include <iostream>
#include <typeinfo>
#include "lamda.h"
int ext = 10 ;
int main()
{
    // normal
    auto func1 = []()
    {
        cout << "func1:hello world." << endl;
    };
    func1();
    // var func1 type Z4mainE3$_1 ,only auto

    // ignore params
    auto func2 = [] { cout << "func2:haha." << endl; };
    func2();

    // spec ret
    auto func3 = []() -> int { return 1.0; };
    cout << "func3 ret:" << typeid(func3()).name() << "=" << func3() << endl;

    // mutil return spec ret
    auto func4 = [](int i) -> int { if(i>10) return 1; else return 2.3; };
    cout << "func4 ret:" << typeid(func4(5)).name() << "=" << func4(5) << endl;


    funcExt();

    // normal para_list lambda,compared to func9() and func7()
    int a=5,b=6;
    auto func5 = [](int& x,int& y)
    {
        x++,y++;
        return x+y;
    };
    cout << "func5 sum:" << func5(a,b) << " a:" << a << " b:" << b << endl;

    // capture
    // capture opt: -- only capture non-static var
    // blank 不捕获任何变量
    // = 捕获外部作用域所有自动变量,按值传递给函数体,且包含this捕获,如果存在对象
    // & 捕获外部作用域所有自动变量,按引用传递给函数体,且包含this捕获,如果存在对象
    // this 按引用捕获当前对象
    {
        int c=7;
        {
            int e=9;
            {
                int f=11;/*static int ext=10;*/
            }
            auto func6 = [a, c, e, ext/*f*/]()
            {
                // capture f is illegal,not in lambda scope
                // ext is static ,not captured, but capture list allowed -- warning
                cout<<"func6 a:"<<a<<" c:"<<c<<" e:"<<e<<" ext:"<<ext<</*" f:"<<f<<*/endl;
            };
            func6();
        }
        auto func7 = [=,&a]()
        {
            // capture e is illegal,not in lambda scope
            cout<<"func7 a:"<<a<<" c:"<<c<</*" e:"<<e<<*/" ext:"<<ext<<endl;
            a++;
            //c++;
        };
        // var copy ,change not access to c
        func7();
        cout<<"a++: "<<a<<endl;
        cout<<"c++: "<<c<<endl;
        auto func8 = []()
        {
            cout<</*"a:"<<a<<" c:"<<c<<" e:"<<e<<*/"func8 ext:"<<ext<<endl;
            ext =11;
        };
        func8();
        cout<<"access static ext+1: "<<ext<<endl;
        // lambda operator() is const(copy capture) , val capture non-modifiable
        auto func9 = [=]()mutable{ c++;cout<<"c: "<<c<<endl;};
        cout<<"c: "<<c<<endl;
        func9();
        cout<<"func9 c++: "<<c<<endl;
        // capture var copy
    }
    Lamb func;
    func.f();
    // diff between = and &
    auto func11 = [=](){return a;};
    cout<<"a: "<<a;
    a++;
    cout<<" func11 a++: "<<func11()<<endl;
    auto func12 = [&]()
    {
        return b;
    };
    cout<<"b: "<<b;
    b++;
    cout<<" func12 b++: "<<func12()<<endl;
}


 转自:https://blog.csdn.net/qq_31331027/article/details/80878076

分享到:
评论

相关推荐

    C++find()函数用法

    在C++编程语言中,`find()`函数是一个非常实用的工具,主要应用于标准库中的算法,尤其是`&lt;algorithm&gt;`头文件中。这个函数允许程序员在序列(如数组、向量或列表)中查找特定元素。在本文中,我们将深入探讨`find()`...

    C++ function、bind以及lamda表达式

    【C++ function、bind及lambda表达式】 C++0x引入了多项新特性,其中lambda表达式、std::function对象...它们提高了代码的可读性和灵活性,降低了回调函数使用的复杂性,并使得C++在函数式编程风格上的应用更加广泛。

    C++11/14 线程中使用Lambda函数的方法

    在本篇文章中,主要介绍lambda函数在多线程中的使用。 先从下面的例子开始吧: #include #include int main() { std::thread t([]() { std::cout &lt;&lt; thread function\n; }); std::cout &lt;&lt; ...

    C++实现的一个可以写递归lambda的Y函数

    C++中的递归lambda函数是一种高级编程技巧,允许lambda表达式在自身内部进行递归调用。然而,由于C++的lambda函数不能直接引用自身,因此需要借助于所谓的“Y组合子”(Y Combinator)来实现这种递归。Y Combinator...

    C++11新特性:Lambda表达式.pdf

    C++11新特性:Lambda表达式 Lambda表达式是C++11新特性中的一种,全新的特性听起来很深奥,但却是很多其他语言早已提供(比如C#)或者即将提供(比如Java)的。Lambda表达式就是用于创建匿名函数的,GCC 4.5.x和...

    C++ 中使用lambda代替 unique_ptr 的Deleter的方法

    在C++编程中,`std::unique_ptr`是一种智能指针,它负责管理动态分配的对象,并在不再需要对象时自动释放内存。`unique_ptr`的一个关键特性是它的删除器(Deleter),这是一个用于销毁所指向对象的函数或函数对象。...

    C++实现delegate

    用C++做项目的时候,尤其是写客户端的时候经常会有事件回调的设计,一般的方式是使用虚函数表,用一个虚基类包含一系列的回调函数。但这种方式和C++11的lamda不兼容,为了更方便的实现事件回调机制,使用delegate是...

    Wolfe Powell 最优化方法 C++ 程序

    根据提供的文件信息,我们可以归纳出以下关于 Wolfe-Powell 最优化方法及其 C++ 实现的关键知识点: ### 1. Wolfe-Powell 最优化方法简介 Wolfe-Powell 方法是一种用于求解无约束最优化问题的算法,它基于一维搜索...

    C++11中lambda、std::function和std:bind详解

    **Lambda表达式**是C++11引入的一种内联匿名函数,它允许我们在需要的地方直接定义函数对象,而无需单独声明一个函数。Lambda表达式的语法结构如下: ```cpp [capture-list] (params) -&gt; return-type { body } ``` ...

    MOEA/D代码 自己实现 C++版

    ZDT1、ZDT2、DTLZ1测试函数也写好了,附有实验效果图,希望对大家学习有帮助!! void generateLamda(int M)//产生N 个权重向量 weight vector //lamdaM 为 N*M矩阵(N个lamda,每个lamda有m维) { //动态生成二维数组...

    C++Helper–使用C++11实现半同步半异步线程池

     本文对处理任务的接口,也进行了包装,可接受:函数对象、成员函数、普通函数、fucntion和lamda表达式,便于完美的应用到实际工作中。  本文源码见【完整代码】章节,或GitHub:...

    Lamda:Lambda 风格的示例代码

    在压缩包文件"Lamda-master"中,可能包含了一些使用C++ Lambda表达式的示例代码。这些代码可能涉及了不同的使用场景,例如对容器进行排序、实现事件处理、以及利用闭包进行状态管理等。通过深入研究这些示例,你可以...

    Qt事件处理,定时器

    Qt事件处理系统是构建在C++之上的,它提供了一种高效且灵活的方式来管理应用程序中的各种交互。事件是用户与应用程序进行交互时产生的通知,如键盘输入、鼠标点击或窗口大小改变。在Qt中,事件被封装为`QEvent`类的...

    Qt thread pool 线程池样例,信号槽,跨线程 lambda

    总结来说,Qt的线程池、信号槽和lambda表达式结合使用,能让我们在C++应用程序中高效地管理多线程,同时保持代码的清晰和可维护性。通过理解并熟练运用这些技术,我们可以编写出更加健壮、响应迅速的应用程序。

    基于简化分布式模型与数据结构理论的SPARK教学方法研究.pdf

    由于引入了匿名函数和Lamda表达式,函数式编程可以写出极其简洁的代码。例如,要将集合A中的所有元素加上3并放到集合B中,通过一行代码就可以实现:B=A.map(x=&gt;x+3)。这里的map函数相当于数学上的函数f,它是一个...

    cpp-stub 开源代码

    `cpp-stub` 是一个专门为C++编写的单元测试打桩库,它允许开发者在测试过程中替换特定函数的行为,以便于隔离被测试代码并进行精确控制。开源代码库通常包含完整的实现、示例、文档以及修复的错误,以帮助用户更好地...

Global site tag (gtag.js) - Google Analytics