用多态成员函数替换 lambda 函数
Replace lambda function with polymorphic member function
我在多态 class Parent
中有以下成员,我正在寻找一种方法来用某种虚拟成员 bar
替换 foo
:
void Parent::myFunc() {
// lots of variables
// complicated calculations
while (/* loop condition */) {
// more variables and calculations
auto foo = [&](int n) {/* ... */};
foo(42);
// want to replace with virtual
// bar(42);
}
}
我遇到的问题是 foo
捕获了所有内容,我不知道授予 bar
相同访问权限的正确方法。
- 将所有内容作为参数传递给
bar
会导致参数列表很大,这似乎不是一个优雅的解决方案
- 我也可以将
myFunc()
的局部变量转换为 Parent
的成员,但这会不必要地延长这些变量的生命周期,尤其是循环变量。
你不想让本地人成为成员是对的——这会失去线程兼容性等。由于可以在其他翻译单元中定义覆盖函数,因此您必须定义某种接口并调用它。
如果您想避免长参数列表,请将参数组合到一个结构中(它可能是基 class 的受保护成员类型)。如果合适,您甚至可以在每次迭代中重用结构对象并仅更新相关字段,或者使它们成为对适当局部变量的引用。
如果它适用于派生的 classes,您还可以定义几个虚函数,以使用当前捕获的变量的子集调用。
在任何一种情况下,这些捕获模拟都将从用于任何目的的真实 lambda 中调用(例如,评论中提到的回调)。
我在多态 class Parent
中有以下成员,我正在寻找一种方法来用某种虚拟成员 bar
替换 foo
:
void Parent::myFunc() {
// lots of variables
// complicated calculations
while (/* loop condition */) {
// more variables and calculations
auto foo = [&](int n) {/* ... */};
foo(42);
// want to replace with virtual
// bar(42);
}
}
我遇到的问题是 foo
捕获了所有内容,我不知道授予 bar
相同访问权限的正确方法。
- 将所有内容作为参数传递给
bar
会导致参数列表很大,这似乎不是一个优雅的解决方案 - 我也可以将
myFunc()
的局部变量转换为Parent
的成员,但这会不必要地延长这些变量的生命周期,尤其是循环变量。
你不想让本地人成为成员是对的——这会失去线程兼容性等。由于可以在其他翻译单元中定义覆盖函数,因此您必须定义某种接口并调用它。
如果您想避免长参数列表,请将参数组合到一个结构中(它可能是基 class 的受保护成员类型)。如果合适,您甚至可以在每次迭代中重用结构对象并仅更新相关字段,或者使它们成为对适当局部变量的引用。
如果它适用于派生的 classes,您还可以定义几个虚函数,以使用当前捕获的变量的子集调用。
在任何一种情况下,这些捕获模拟都将从用于任何目的的真实 lambda 中调用(例如,评论中提到的回调)。