gpt4 book ai didi

c++ - 在 lambda 之外访问捕获的变量

转载 作者:搜寻专家 更新时间:2023-10-31 02:03:06 25 4
gpt4 key购买 nike

是否可以在 lambda 代码本身之外访问捕获的 lambda 值。

template <typename F>
void bar(const F& f)
{
auto d = f.x;
}

int main()
{
int x;
bar([&]{
do_something(x);
});
}

最佳答案

这是不可能的。 lambda 是一个黑盒子。

方案一:使用返回值

如果您只需要一个捕获的变量,并且如果 lambda 最初应该是空的,那么只需返回这个值。

template <typename F>
void bar(const F& f)
{
auto d = f();
}
int main()
{
int x;
bar([&]{
auto y=x; // in case do_something would change x
do_something(x);
return y;
});
}

选项 2:使用多个返回值

如果您已经需要返回一个值,您可以使用 sam 方法,但使用一对或一个元组一次返回多个值:

template <typename F>
void bar(const F& f)
{
auto d = f();
cout << d.first<<endl;
}
int main()
{
int x;
bar([&]{
auto y=x;
do_something(x);
return make_pair(y, 0); // first is parameter, second real return
});
}

选项 3:使用可调用对象

好吧,它不再是 lambda。但是如果你需要访问一些更复杂函数的参数,你可以使用一个可调用对象。可调用对象是一个普通的类或结构。然后它可以传达任何你想要的参数,但你需要定义它们并在可调用的构造函数中预见它们:

template <typename F>
void bar(const F& f)
{
auto d = f.x;
f();
}
int main()
{
struct Tmp { // I won't need this callable elsewhere...
int &x;
Tmp (int& x) : x(x) {}
void operator() () const {
do_something(x);
}
};

int x;
Tmp t(x);
bar(t);
}

在这个例子中,我使用了一个本地类定义,以免用一次性结构污染命名空间。

Demo

您可以通过提供 lambda 作为构造函数的参数,捕获大量变量,并使用可调用成员来仅传达您可以在 bar() 中使用的少数变量,从而将这种方法与 lambda 相结合。 .

补充说明

通过引用捕获要小心(当捕获的变量可能已经死亡时不要使用 lambda。

如果您需要访问 lambda 的命名参数,则设计可能存在问题。 Lambda 不用于传递捕获的变量。因此,如果您觉得有这种需要,那么可赎回 Assets 可能是更好的选择。

关于c++ - 在 lambda 之外访问捕获的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56030092/

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