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