Jac*_*own 0 c++ lambda member-functions local-functions
我有一个成员函数需要访问成员数据和“本地”数据:
struct S final
{
int i = 123;
// ... a bunch of legacy code ...
void f()
{
// ... a bunch of legacy code ...
double d = 1.23;
// ... a bunch of legacy code ...
g(d);
// ... a bunch of legacy code ...
}
// ... a bunch of legacy code ...
void g(double& d)
{
i = 456; d = 4.56;
}
};
Run Code Online (Sandbox Code Playgroud)
这当然是有效的......但是,随着更多本地变量被f()传递到g(). 有没有一种“简单”的方法可以避免这种情况?
使用 lambda 是“常规”答案,但这意味着 的代码g()必须移至f();的一部分。我不想这样做:
struct S final
{
int i = 123;
void f()
{
double d = 1.23;
auto g = [&]() { i = 456; d = 4.56; } // code moved here :-(
g(d);
}
};
Run Code Online (Sandbox Code Playgroud)
像这样的东西很接近(尽管 lambda “更好”,因为局部变量是闭包的一部分[&]),但它不是有效的 C++
struct S final
{
int i = 123;
void f()
{
double d = 1.23;
void g();
g();
}
void f::g()
{
i = 456; d = 4.56;
}
};
Run Code Online (Sandbox Code Playgroud)
或者(再次使用虚构的语法)一种声明lambda 并稍后定义它的方法:
struct S final
{
int i = 123;
void f()
{
double d = 1.23;
auto g = [&]();
g();
g = { i = 456; d = 4.56; }
}
};
Run Code Online (Sandbox Code Playgroud)
只需将它们放入结构中即可
struct S final
{
struct g_params { //that's it
double d;
};
int i = 123;
void f()
{
g_params d = {1.23};
g(d);
// ... assume this is already a large function ...
}
// ... lots of code here ...
void g(g_params& p)
{
i = 456; p.d = 4.56;
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
78 次 |
| 最近记录: |