C++ Lambda 捕获私有类成员

24

这是我的一个类的一部分:

//...
        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;
    };

我想访问Lambda的公共成员函数dump_dvars中的私有成员变量output_file。当我捕获this指针时,我无法访问该变量,因为它是私有的,但我也不想将其设置为公共的!我已经阅读了这个问题(如何使Lambda成为类的友元?),但我不想创建另一个函数。因此,我目前解决这个问题的方法是创建对私有成员的引用,并通过引用捕获列表将该变量传递给我的Lambda。

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


因为我想要使用C++11的新特性并且使用算法和lambda表达式! - user4541498
3
“…无法让我访问私有成员” - 它不能??这是 VS2013 的问题吗?我使用 clang 和 gcc 都可以。您能否在编译时包含您收到的确切错误消息(请在您的问题中)? - WhozCraig
2
我能够在lambda中访问受保护的和私有成员,但是VS intellisense在语句完成时不显示它们。为什么_array_size是一个指针? - LogicStuff
1
显然,我被 IntelliSense 愚弄了,正如 LogicStuff 所指出的那样。我正在处理一个与逆向工程有关的项目,_array_size 指针指向 4 个字节,这些字节似乎保存着由 _array_start 指向的数组的大小! - user4541498
1
@WhozCraig 我注意到 IntelliSense 没有显示私有成员,但是当我添加了一个公共的虚拟 int 时,它显示出来了。下次我应该不要相信 IntelliSense,先编译 :-) (可惜 πάντα ῥεῖ从我的问题中删除了 VS2013 标签) - user4541498
显示剩余4条评论
1个回答

25

你应该在 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();
}

2
谢谢你的回答,你是正确的。正如我在评论中所说,Visual Studios IntelliSense没有显示私有成员。 - user4541498
11
[x = x](){ /* use x */ } 这种写法同样可行,它将限制捕获只针对真正需要的内容。额外的好处是,这还允许您通过引用来捕获(例如,[&x = x](){}),而当捕获 this 时无法实现这一点。 - IInspectable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接