C++ 在std::function中存储不可复制但可移动的对象
假设我有一个函子s,它是不可复制但可移动的,我如何将它存储在std::function中?i、 如何使下面的代码编译?(使用通用条款4.6)C++ 在std::function中存储不可复制但可移动的对象,c++,C++,假设我有一个函子s,它是不可复制但可移动的,我如何将它存储在std::function中?i、 如何使下面的代码编译?(使用通用条款4.6) #包括 #包括 结构 { S()=默认值; S(S const&)=删除; S&运算符=(S常量&)=删除; S(S&&{} void运算符()({} }; std::函数func; void make_func() { S S; func=std::bind(std::move(s));//这不会编译 } int main() { make_func()
#包括
#包括
结构
{
S()=默认值;
S(S const&)=删除;
S&运算符=(S常量&)=删除;
S(S&&{}
void运算符()({}
};
std::函数func;
void make_func()
{
S S;
func=std::bind(std::move(s));//这不会编译
}
int main()
{
make_func();
}
据我所知,标准中的std::function应该是可复制的。因此,你不能直接实现你想要的
不过,我想你可以带上一些定制包装纸。事情会是这样的:
- 使包装器包含一个到实际函子的
李>std::shared_ptr
- 当从函子右值构造包装器时,将函子移动到动态分配的内存中李>
- 包装器和析构函数的复制构造函数仅由
copy-ctor/destructor处理李>shared_ptr
- 包装器的
取消对实际函子的智能指针的引用,并将其委托给operator()
operator()
s
是本地的,超出了范围…std::function
不包含它所包装的可调用对象(我会精确地假设它们不需要是可移动/可复制的)。如果重新设计代码并能够初始化std::function
,这是可能的。例如,这可以工作S;std::function func(std::ref(s));func()代码>。但您还必须使s
在func
之前不超出范围,这意味着它在某种意义上必须是全局的。但如果你有问题的话,你仍然可以在std::function
(有限制)中存储一个可移动的对象?使用可变模板和参数类型的完美转发来实现这一点。感谢doublep,这满足了我当前的需要。
#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();
}