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

Posted

技术标签:

【中文标题】如何在 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 表达式中捕获单个类数据成员?的主要内容,如果未能解决你的问题,请参考以下文章

Lambda 表达式和变量捕获

访问 C++14 lambda 捕获,如结构成员

C++ lambda表达式

在成员函数内的 lambda 捕获列表中使用成员变量

对成员函数的模糊调用以在 lambda 中捕获 this

如何在单个 lambda 表达式中同时使用更新和加入 [关闭]