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

标签 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();
}

最佳答案

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

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

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

关于c++ - 在 std::function 中存储不可复制但可移动的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7944635/

上一篇:c++ - 可选共享库

下一篇:c++ - 混合术语

相关文章:

c++ - 是否可以在不定义类的情况下重载 [] 运算符以访问 char 的特定位?

C++:将数学函数及其导数分组到一个实体中

c++ - 如何启动将由 mysql_commit() 提交的 MySQL 事务

c++ - 文件设置正确,但 eof() 和 peek() 意外从新流返回错误值

java - C++ 或 Java 中的 Linux 守护进程?

C++ Push_back 一个对象并获取指向该对象的指针

c++ - 可以将具有 Base 类型的 STL 容器转换为 Derived 类型吗?

c++ - 我的 vscode 的控制台输出看起来很奇怪,如何解决?

c++ - VC++ wcscpy_s 在 "Buffer is too small"上随机断言

c++ - Qt:当 boundingRect() 中心不在 View 中时,自定义 QGraphicsItem 不显示