You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:21:00