【问题标题】:Storing noncopyable but movable object in std::function在 std::function 中存储不可复制但可移动的对象
【发布时间】:2011-10-30 20:55:13
【问题描述】:

假设我有一个不可复制但可移动的仿函数 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();
}

【问题讨论】:

  • 这行不通,因为s 是本地的并且超出范围...
  • std::function&lt;&gt; 不包含它包装的可调用对象(我假设正是为了避免要求它们是我可移动/可复制的)。
  • 如果您重新设计代码并且能够初始化 std::function,这是可能的。例如,这适用于S s; std::function&lt;void()&gt; func(std::ref(s)); func();。但是您还必须使sfunc 之前不要超出范围,这意味着它在某种意义上必须是全局的。但是如果这是您的问题,您仍然可以std::function(有限制)中存储一个可移动对象。

标签: c++


【解决方案1】:

据我了解的标准,std::function 应该是可复制的。因此,你无法直接达到你想要的。

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

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

【讨论】:

  • 为读者练习?使用可变参数模板和参数类型的完美转发来实现这一点。
  • 感谢 doublep,满足我目前的需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多