gpt4 book ai didi

C++ lambda : how to 'freeze' values of local variables?

转载 作者:太空狗 更新时间:2023-10-29 19:41:23 27 4
gpt4 key购买 nike

在下面的代码中,类 A 有一个 lambda 作为数据成员,以及一个到这个 lambda 的 getter。是否可以将 lambda 的局部变量“卡住”为 getter 返回 lambda 时存在的值?

换句话说具体在这个例子中,是否可以让代码打印 6 而不是 150,即使 myA.b 的值发生变化?

#include <iostream>
#include <functional>

class A
{
double b;

std::function<double(double)> myFunction = [=] (double x)
{
double localb = b;
return localb*x;
};

public:

void set_b(double value){b = value;};

std::function<double(double)> get_myFunction(){return myFunction;};
};

int main()
{
A myA;
myA.set_b(2.0);

std::function<double(double)> retrievedFunction = myA.get_myFunction();

myA.set_b(50.0);

std::cout << retrievedFunction(3.0) << std::endl;

return 0;
}

最佳答案

这里有一个方法:

#include <iostream>
#include <functional>

class A
{
double b;

public:

void set_b(double value) { b = value; }

std::function<double(double)> get_myFunction() const {
return [b = b] (double x) { return b*x; };
}
};

int main()
{
A myA;
myA.set_b(2.0);
std::function<double(double)> retrievedFunction = myA.get_myFunction();
myA.set_b(50.0);
std::cout << retrievedFunction(3.0) << '\n';
}

要点:

  • 而不是创建单个 std::function什么时候A被构建,我们延迟函数的创建直到get_myFunction叫做。否则我们只会捕获 b 的(仍未初始化的)值在开头。

  • 我们明确捕获 b按值(value)。我们不能只说 [b]在捕获列表中,因为外部 b不是真正的变量,它只是 *this 的成员以及对 b 的任何使用真的意味着 this->b .这就是为什么 [=]不起作用:它捕获 this按值(这只是一个指针)。

    [b = b]语法需要 C++ 14。

    另一种选择是 [*this] ,它捕获整个对象的拷贝。这需要 C++ 17。

关于C++ lambda : how to 'freeze' values of local variables?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52279906/

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