一个lambda是一个类固有的

时间:2017-02-21 00:37:04

标签: c++

是否有可能在类X内部并在类X外定义的lambda神奇地使用该类X的成员变量?

像这样:

struct Foo {
    int x;
    std::function<void(void)> f;
};

int main() {
    Foo foo;

    foo.x = 10;
    foo.f = []() {
        std::cout << x;
    };

    foo.f();
}

如果没有任何上下文,它会神奇地使用Foo结构中的“x”。

我认为因为lambda是一个匿名结构,如果我在该函数中传递对象“foo”(C方式),它显然有效:

struct Foo {
    int x;
    std::function<void(Foo&)> f;
};

int main() {
    Foo foo;

    foo.x = 10;
    foo.f = [](Foo& me) {
        std::cout << me.x;
    };

    foo.f(foo);
}

这有什么解决方法吗?

2 个答案:

答案 0 :(得分:3)

自然的方法是使用构造函数:

struct Foo {
    int x;
    std::function<void()> f = [this]() { std::cout << x; };
};

或许是默认成员初始值设定项:

Foo::f

(当然,该函数没有采用任何参数,所以我相应地改变了Foo m; m.x = 5; m.f(); 的类型。)

lambda不能是&#34;类&#34;固有的,因为lambda引用类类型的对象,所以每个对象必须得到它自己的lambda。

用法:

inc

答案 1 :(得分:2)

没有任何上下文,你可以这样做

foo.f = [x=foo.x]() {
   std::cout << x;
};