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

时间:2011-10-30 11:30:43

标签: c++

假设我有一个仿函数s,它是不可复制但可移动的,我怎样才能将它存储在std :: function中?即,如何编译以下代码? (使用gcc 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();
}

1 个答案:

答案 0 :(得分:2)

据我了解标准,std::function应该是可复制的。因此,您无法直接实现您想要的目标。

尽管如此,你可以使用一些自定义包装器。它会是这样的:

  • 让您的包装器包含std::shared_ptr到实际的仿函数;
  • 当从仿函数右值构造包装器时,将仿函数移动到动态分配的内存中;
  • 包装器和析构函数的复制构造函数只需由shared_ptr copy-ctor / destructor处理;
  • 包装器的
  • operator()取消引用指向真实仿函数的智能指针,并委托给operator()