避免c++中的lambda副本
Avoiding lambda copies in c++
我需要通过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);
}
由于可以更改MyClass1
和MyClass2
,因此可以通过右值引用获取函数,然后沿着获取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);
}
实时示例
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 用callgrind追踪不必要的副本
- 如何将lambda作为模板类的成员函数参数
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 在 lambda 捕获中声明的变量的类型推导
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 使lambda不可复制/不可移动
- 使用 lambda 表达式创建线程时,如何为每个线程提供自己的 lambda 表达式副本
- 可变 lambda 是否具有自己的捕获值副本
- 错误,无法在构造体主体中构造lambda的副本
- 在 lambda 中没有按值分配副本
- 使用 lambda 函数擦除 std::vector 中相同值的副本
- 如何避免在调用异步函数进行 lambda 回调时出现额外的副本
- 避免c++中的lambda副本