gpt4 book ai didi

c++ - 在 C++11 中重新绑定(bind) lambda...这可能吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:24:33 25 4
gpt4 key购买 nike

我有一个情况,我有一个 lambda 作为由某个函数调用创建的成员变量。问题是它将此作为其操作的一部分进行捕获。稍后,我希望能够复制整个对象...

但是,在复制时我不知道 lambda 是如何创建的(它可能是通过不同的代码路径在多个位置定义的)。因此,对于在复制构造函数中放入什么,我有些不知所措。理想情况下,我想将 lambda 的捕获“重新绑定(bind)”到创建的新“this”。

这有可能吗?

下面是一些示例代码:

#include <iostream>
#include <string>
#include <functional>

class Foo
{
public:

Foo () = default;
~Foo () = default;

void set (const std::string & v)
{
value = v;
}

void set ()
{
lambda = [&]()
{
return this->value;
};
}

std::string get ()
{
return lambda();
}


std::string value;
std::function <std::string (void)> lambda;
};

int main ()
{
Foo foo;

foo.set ();
foo.set ("first");

std::cerr << foo.get () << std::endl; // prints "first"

foo.set ("captures change");

std::cerr << foo.get () << std::endl; // prints "captures change"

Foo foo2 (foo);
foo2.set ("second");

std::cerr << foo.get () << std::endl; // prints "captures change" (as desired)
std::cerr << foo2.get () << std::endl; // prints "captures change" (I would want "second" here)

return 0;
}

提前致谢。

最佳答案

您看到的问题是 this 指针被捕获到 lambda 中,但您现在正在执行来自另一个对象的函数拷贝。它在您的示例中有效,因为这两个对象都存在,但它是一个等待发生的悬空指针。

最简洁的方法是修改您的 std::function 和您的 lambda 以获取指向该类的指针的参数,并使用传入的指针而不是捕获它。根据 lambda 的内容,您可以选择捕获值。

class Foo
{
public:

Foo () = default;
~Foo () = default;

void set (const std::string & v)
{
value = v;
}

void set ()
{
lambda = [](Foo* self)
{
return self->value;
};
}

std::string get ()
{
return lambda(this);
}


std::string value;
std::function <std::string (Foo*)> lambda;
};

例子在 IDEOne

关于c++ - 在 C++11 中重新绑定(bind) lambda...这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11778016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com