c++ - 在 C++ 中避免 lambda 拷贝

标签 c++ function c++11 lambda

我需要通过 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,您可以通过右值引用获取该函数,然后移动

#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);
}

Live Example

关于c++ - 在 C++ 中避免 lambda 拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33554072/

相关文章:

c++ - 用于 std::array 的前向列表初始化的可变参数模板

c++ - 将类转换为该类的指针的简单情况

c++ - boost - 添加到 'corecrt.h' 的路径

Excel是否可以使用嵌套函数?

c++ - 初学者的 C++ : How do I pass a list as a function parameter?

javascript - 如何使用 JavaScript 中的任何高阶函数来为以下代码获取所需的输出?

c++ - 运行时抛出的 std::regex_error 异常

c++ - 可变参数模板的可扩展性

c++ - Arduino:如果在构造函数中使用 this->object.attach(pin),Servo 类会破坏伺服行为

c++ - 使用std::vector作为char缓冲区