C++ 假装打包的_任务是可复制构造的
我一直在寻找解决问题的办法 我想做的事情是这样的:C++ 假装打包的_任务是可复制构造的,c++,c++11,asynchronous,C++,C++11,Asynchronous,我一直在寻找解决问题的办法 我想做的事情是这样的: #include <future> #include <functional> #include <iostream> namespace { std::function<void()> task; std::future<int> make(int val) { auto test = std::packaged_task<int()>([val](){
#include <future>
#include <functional>
#include <iostream>
namespace {
std::function<void()> task;
std::future<int> make(int val) {
auto test = std::packaged_task<int()>([val](){
return val;
});
auto fut = test.get_future();
task = std::move(test);
return fut;
}
}
int main() {
auto fut = make(100);
task();
std::cout << fut.get() << "\n";
}
这个“对我有用”,但这真的是正确的代码吗?有没有更好的方法达到同样的净效果
(请注意,第二个示例中的
std::shared_ptr
的寿命对于我的真实代码很重要。很明显,我将采取措施防止调用相同的std::函数两次)。您的问题似乎源于类型不稳定性:
std::function<void()> task; // Notice this is not a package_task
std::function任务
是经过深思熟虑的,不是一个bug-它是为了在std::packaged_任务
中键入擦除操作符()。我希望它能够工作,因为隐式转换可以工作,而它在原始版本中不工作的唯一原因是删除了std::packaged_task
的复制构造函数。
std::function<void()> task; // Notice this is not a package_task
task = std::move(test); // when test is `std::packaged_task<int()>`
namespace {
std::packaged_task<int()> task; // Change this.
std::future<int> make(int val) {
auto test = std::packaged_task<int()>([val](){
return val;
});
auto fut = test.get_future();
task = std::move(test); // This now compiles.
return fut;
}
}
namespace {
std::packaged_task<int()> task;
std::future<int> make(int val) {
std::packaged_task<int()> test([val](){return val;});
auto fut = test.get_future();
task = std::move(test);
return fut;
}
}