用多态成员函数替换 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 相同访问权限的正确方法。

  1. 将所有内容作为参数传递给 bar 会导致参数列表很大,这似乎不是一个优雅的解决方案
  2. 我也可以将 myFunc() 的局部变量转换为 Parent 的成员,但这会不必要地延长这些变量的生命周期,尤其是循环变量。

你不想让本地人成为成员是对的——这会失去线程兼容性等。由于可以在其他翻译单元中定义覆盖函数,因此您必须定义某种接口并调用它。

如果您想避免长参数列表,请将参数组合到一个结构中(它可能是基 class 的受保护成员类型)。如果合适,您甚至可以在每次迭代中重用结构对象并仅更新相关字段,或者使它们成为对适当局部变量的引用。

如果它适用于派生的 classes,您还可以定义几个虚函数,以使用当前捕获的变量的子集调用。

在任何一种情况下,这些捕获模拟都将从用于任何目的的真实 lambda 中调用(例如,评论中提到的回调)。