如何在C++类中设置std::function成员,同时支持lambda的拷贝与移动
适配拷贝/移动场景的std::function成员设置方法实现
方案1:按值传参+移动赋值(通用简洁首选)
直接修改你现有的实现为如下形式即可自动适配两种场景:
void MyClass::SetFunc(SomeFunc Func1) { Func = std::move(Func1); }
适配逻辑:
- 当传入简单lambda/左值
std::function时:Func1通过拷贝构造生成,随后移动给成员变量,仅多一次极低开销的移动操作 - 当传入需要移动的复杂lambda/右值
std::function时:Func1通过移动构造生成,随后移动给成员变量,全程无拷贝
这个方案写法最简单,没有模板带来的代码膨胀问题,绝大多数场景下性能完全够用。
方案2:完美转发实现(极致性能可选)
如果需要完全消除额外的移动开销,可以用模板完美转发实现:
首先在类内声明模板方法:
class MyClass { // 注:你原代码此处漏写了std::function的闭合右括号,已修正 using SomeFunc = std::function<void(const std::string &str)>; SomeFunc Func; public: template<typename F> void SetFunc(F&& f) { Func = std::forward<F>(f); } };
实现逻辑:
将传入的任意值类型的可调用对象原封不动转发给std::function的赋值运算符,左值参数直接执行拷贝赋值,右值参数直接执行移动赋值,没有任何额外的中间对象开销,性能最优。
内容的提问来源于stack exchange,提问作者Olich
相关产品推荐
相关产品推荐

