在 std::function 中存储不可复制但可移动的对象

2023-11-22

假设我有一个函子 s,它是不可复制但可移动的,我如何将它存储在 std::function 中?即,如何使以下代码编译? (使用海湾合作委员会4.6)

#include <functional>
#include <iostream>

struct S
{
  S() = default;
  S(S const&) = delete;
  S& operator=(S const&) = delete;
  S(S&&) { }
  void operator()() { }
};

std::function<void()> func;

void make_func()
{
  S s;
  func = std::bind(std::move(s));  // This won't compile
}

int main()
{
  make_func();
}

据我了解的标准,std::function应该是可复制的。因此,您不能directly实现你想要的。

不过,我猜你可以使用一些自定义包装器。事情会是这样的:

  • 让你的包装包含一个std::shared_ptr到实际函子;
  • 当从函子右值构造包装器时,将函子移动到动态分配的内存;
  • 包装器和析构函数的复制构造函数只需由shared_ptr复制者/析构者;
  • operator()对于包装器,取消引用指向真正函子的智能指针并委托给operator() on it.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 std::function 中存储不可复制但可移动的对象 的相关文章

随机推荐