C++ Lambda捕获私有类成员

13 c++ c++11

这是我班级的一部分:

//...
        bool dump_dvars()
        {
            fstream& refvar{ output_file };

            for_each(_array_start, _array_start + *_array_size,
                [&refvar](const void* dvar) -> void
            {
                //work with output_file
            });

            return true;
        }

    private:
        void** _array_start;
        unsigned int* _array_size;
        fstream output_file;
    };
Run Code Online (Sandbox Code Playgroud)

我想访问我的Lambda的私有成员变量output_file,它位于公共成员函数dump_dvars中.当我捕获这个指针时,我无法访问该变量,因为它是私有的,我也不想让它公开!我已经读过这个问题(如何让lambda成为一个类的朋友?)但我不想创建另一个函数.所以我目前解决的问题是创建对私有成员的引用,并通过引用捕获列表将该变量传递给我的Lambda.

这是一个很好的解决方案和良好的风格还是有更好的解决方案?

Mar*_*ane 16

你应该在lambda中捕获'this'.

以下代码编译并适用于g ++,clang,VS2010和VS2013.

#include <iostream>

class A
{
public:
    A() : x(5){}
    void f() const
    {
        ([this]()
        {
            std::cout << x << std::endl;
        })();
    }
private:
    int x;
};

int main()
{
    A a;
    a.f();
}
Run Code Online (Sandbox Code Playgroud)

  • `[x = x](){ /* use x */ }` 也有效,它将捕获限制为真正需要的。额外的好处:这也允许您通过引用捕获(例如`[&amp;x = x](){}`),这是捕获`this`时无法做到的。 (6认同)
  • 谢谢你的回答,你是对的.正如我在评论中已经说过的,Visual Studios IntelliSense没有显示私人成员. (2认同)