如何使用lambda表达式捕获局部变量?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用lambda表达式捕获局部变量?相关的知识,希望对你有一定的参考价值。

现在我想写个回调函数,这个回调函数的参数是一个lambda表达式,这个lambda表达式的实现,要写在另外一个函数中,等这个函数在lambda的体中实现完以后,再回调到原函数中往下执行。但是我不知道在原函数的声明中具体应该怎么写这种可以捕获局部变量的lambda表达式的形参。

编程语言:C++11

参考技术A lambda本身是无法捕捉局部变量的,你可能需要放弃lambda语法,用一个类实现lambda所在接口,然后把局部变量作为构造函数参数给这个类的实例对象

如何在 lambda 表达式中捕获单个类数据成员?

【中文标题】如何在 lambda 表达式中捕获单个类数据成员?【英文标题】:How to capture a single class data member in a lambda expression? 【发布时间】:2015-06-04 20:34:00 【问题描述】:

我知道以下问题:C++11 lambdas: member variable capture gotcha。此外,我知道需要通过捕获 this 指针来捕获类成员,正如该问题的答案所明确指出的那样。

是的。捕获成员变量总是通过捕获这个来完成的;这是访问成员变量的唯一方法。

但是,捕获this 指针捕获所有类成员。是否可以限制捕获哪些类成员?例如,是否可以捕获单个类成员

我知道以下方法行不通,但有可能实现吗?

class Foo

public:
    Foo() : mBar1(1), mBar2(2) 

    void doBar()
    
        auto test = [this->mBar1]()
            
                std::cout << mBar1 << "\n";
                // Trying to access 'mBar2' here would fail to compile...
            ;

        test();
    

    int mBar1;
    int mBar2;
;

来自cmets:

为什么需要这个?

我不需要 这样做。我只是想了解这是否可行,如果可行,该怎么做。

【问题讨论】:

为什么需要这个?你不能相信自己吗? @EdHeal 这个问题不一定是关于 需要 与了解它是否可能/如何做到这一点。但是,我认为自记录 lambda 表达式有一些价值,可以清楚地说明捕获的状态、捕获方式(即通过值/引用)以及捕获状态的来源。 【参考方案1】:

使用 C++11,您必须捕获 this

但是,在 C++14 中,您可以通过值捕获任意表达式:

[mBar1 = this->mBar1]()  ... 

或参考:

[&mBar1 = this->mBar1]()  ... 

【讨论】:

@Brian 我目前仅限于 C++11 编译器。但是,您是正确的,我对 C++11 标记的使用并不意味着我不想知道这在 C++14 或任何其他未来/提议的 C++ 标准中是可能的,但它是合适的声明它在 C++11 中是不可能的。 问题可能被标记为“C++11”,但要意识到这一点:C++14 增加了一个解决方案,如果 C++11 中已经有一个好的解决方案就不会发生这种情况。我们无法证明否定的,但这至少可以可信不存在 C++11 解决方案。【参考方案2】:

如果你能够使用 C++14 编译器,你可以使用

auto test = [&bar = this->mBar1]()

    std::cout << bar<< "\n";
;

如果您仅限于使用 C++11 编译器,则必须捕获 this

【讨论】:

以上是关于如何使用lambda表达式捕获局部变量?的主要内容,如果未能解决你的问题,请参考以下文章

Java语法—— Lambda表达式

第13课 lambda表达式

20145207《Java程序设计》第7周学习总结

如何在lambda中按值捕获`this`和局部变量?

C++ lambda表达式(函数指针和function)

JavaSE-22.1.6Lambda表达式的注意事项