避免c++中的lambda副本

Avoiding lambda copies in c++

本文关键字:副本 lambda 中的 c++ 避免      更新时间:2023-10-16

我需要通过MyClass2将用户定义的lambda传递给MyClass1。我想确保有一个动作,没有副本。下面的代码实现了吗?有没有更好的方法(比如使用编译器完成的隐式移动)?

注意:我可以控制MyClass1和MyClass2

#include <functional>
using MyFunction = std::function<int(int)>;
class MyClass1 {
 public:
   MyClass1(const MyFunction& func): mFunc(std::move(func)) {}
 private:
   MyFunction mFunc;
};
class MyClass2 {
 public:
  MyClass1* getClass1(const MyFunction& func) {
    return new MyClass1(func);
  }
};
int main() {
  MyClass2 cl2;
  const auto& f = [] (int i) { return i; };
  MyClass1* cl1 = cl2.getClass1(f);
}

由于可以更改MyClass1MyClass2,因此可以通过右值引用获取函数,然后沿着获取move

#include <functional>
using MyFunction = std::function<int(int)>;
class MyClass1 {
 public:
   MyClass1(MyFunction&& func): mFunc(std::move(func)) {}
 private:
   MyFunction mFunc;
};
class MyClass2 {
 public:
  MyClass1* getClass1(MyFunction&& func) {
    return new MyClass1(std::move(func));
  }
};
int main() {
  MyClass2 cl2;
  const auto& f = [] (int i) { return i; };
  MyClass1* cl1 = cl2.getClass1(f);
}

实时示例