C++ 包含lambda的结构,通过引用修改值
下面是一个简单的程序,它使用C++ 包含lambda的结构,通过引用修改值,c++,lambda,C++,Lambda,下面是一个简单的程序,它使用value\u控件struct来存储修改整数变量的lambda: #include <iostream> #include <functional> struct value_control { std::function<void(void)> increase; std::function<void(void)> decrease; }; int main() { auto a =
value\u控件
struct来存储修改整数变量的lambda:
#include <iostream>
#include <functional>
struct value_control
{
std::function<void(void)> increase;
std::function<void(void)> decrease;
};
int main()
{
auto a = 123;
value_control a_control{ [&]() { a += 1; }, [&]() { a -= 1; } };
a_control.decrease(); std::cout << a << std::endl;
a_control.increase(); std::cout << a << std::endl;
}
下面是一个版本,它将值控制
创建抽象为生成数值控制
:
#include <iostream>
#include <functional>
struct value_control
{
std::function<void(void)> increase;
std::function<void(void)> decrease;
};
int main()
{
auto make_numeric_control = [](int& var, int change)
{
return value_control
{
[&]() { var += change; },
[&]() { var -= change; }
};
};
auto a = 123;
auto a_control = make_numeric_control(a, 1);
a_control.decrease(); std::cout << a << std::endl;
a_control.increase(); std::cout << a << std::endl;
}
关于如何编写
使数值控件
与第一个版本一样工作的任何建议?这是因为您通过引用捕获更改
,以及由于捕获说明符[&]
而捕获的变量
<当make\u numeric\u control
退出时,code>change将被销毁,因此在闭包内它将是一个悬空引用
您可以通过按引用捕获var
和按值捕获change
来解决此问题:
return value_control
{
[&var, change]() { var += change; },
[&var, change]() { var -= change; }
};
[&,change](){var+=change;}
@PiotrSkotnicki-Perfect。。。谢谢你,彼得!请注意,您的结构不包含lambas。
-19620773
178
return value_control
{
[&var, change]() { var += change; },
[&var, change]() { var -= change; }
};