- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我天真地期望它能编译:
template <typename Func>
auto run(Func && func) {
auto package = std::packaged_task{std::forward<Func>(func)}; // deduce the template args automatically (C++17)
auto future = package.get_future();
enqueue(std::packaged_task<void()>{std::move(package)}); // only works if packaged_task is <R()>, but ok
return future;
}
说明:这可能来自线程池实现,enqueue()
只是将参数排队以在工作线程上执行。
然而,问题是 packaged_task
没有推导指南,因此 C++17 构造函数模板参数推导当然会失败。
那么,为什么没有演绎指南呢?
最佳答案
三个都不是std::future
工厂有推扣指南
std::async
是一个函数模板,所以不需要任何std::promise
必须从 ()
中推导出来, 这是模棱两可的std::packaged_task
必须从潜在的重载函数(和 operator()
s)中推导出来,这是不明确的请注意 packaged_task
是错误的 future 工厂,如果你有你的可调用参数,你只提供可调用它的构造函数。您的示例代码可能希望是 auto future = std::async(std::forward<Args>(args)...);
你的例子应该是这样的
template <typename> struct function_traits;
template <typename Ret, typename...Args>
struct function_traits<std::function<Ret(Args...)>
{
using type = Ret(Args...);
}
template <typename Sig>
using function_traits_t = function_traits<Sig>::type;
template <typename F>
auto run(F&& f) {
using Sig = function_traits_t<decltype(std::function{f})>;
auto package = std::packaged_task<Sig>{std::forward<F>(f)}; // fails to deduce the template args automatically
auto future = package.get_future();
enqueue(std::move(package)); // function can deduce
return future;
}
关于c++ - 为什么 `packaged_task`没有推导指南?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49922871/
正在关注 this excellent tutorial对于futures、promises 和打包任务,我到了要准备自己的任务的地步 #include #include using namesp
在下面的程序中,我试图创建一个带有成员函数的 packaged_task: #include using namespace std; struct S { int calc(int& a)
我天真地期望它能编译: template auto run(Func && func) { auto package = std::packaged_task{std::forward(fu
我正在尝试使用这样的仿函数创建一个打包任务: Worker w(someString, anotherString, i*length,length); boost::packaged_task ta
我试图绕过 std::packaged_task 缺少复制构造函数的问题,以便我可以将它传递给 std::function(它只会被移动)。 我继承自 std::packaged_task 并添加了一
嗨,我不知道如何编写一个正确的队列绑定(bind)并执行传递给方法 OCRQueue::enqueue() 的 lambda 表达式 // the task queue std::queue > ta
编译下面的程序时,出现错误信息: 错误 1 错误 C2228:'.get_future' 的左侧必须具有类/结构/union c:\users\haliaga\documents\visual s
我正在分析以下代码片段并试图详细理解它: template auto ThreadPool::add( FUNCTION&& Function, ARGUMENTS&&... Arguments )
我从 http://en.cppreference.com/w/cpp/thread/packaged_task 中的部分代码中复制了一个奇怪的核心转储, #include #include #i
我正在尝试采用 std::async 风格的“任务”并将其存储在容器中。我必须克服困难才能实现它,但我认为一定有更好的方法。 std::vector> mTasks; template std::fu
我最近在我的项目上运行 valgrind --tool=helgrind 并收到警告“可能的数据竞争”,我认为这是令人担忧的。然而,即使是这个简单的测试程序也会导致此消息: #include #in
我正在尝试使用 packaged_task 实现异步。我正在通过一个模板化函数 bsync 来尝试这个。 bsync 接受 2 个参数:一个函数 f 和一个参数包 args,并返回一个 future
我一直在寻找 problem of type-erasing a std::packaged_task using std::function 的解决方法. 我想做的是这样的: #include #
我正在玩 Antony Williams - C++ Concurrency in Action 一书中的示例 4.14,其中使用 std::packaged_task 和 std::thread 模
我试图将 std::packaged_task 包装在另一个类中,以便与任务调度程序一起使用。 目前,除了 std::future 支持外,我的一切都正常工作。为了获得 std::future 支持,
我正在尝试围绕 Glib::Dispatcher 构建一些包装器,以将任何功能类型分派(dispatch)到分派(dispatch)器中。我想要一些可以将函数传输到 Glib 主循环中的函数分派(di
std::packaged_task 模板有一个接受分配器的构造函数: packaged_task pt {allocator_arg_t, a, f}; 我想问: 1) 它的存在表明 package
是否有一种标准方法可以将 std::packaged_task 添加到现有线程?在任务运行之前必须发生大量开销,所以我想这样做一次,然后保持线程运行并等待任务执行。我希望能够使用 futures,这样
我正在尝试将 packaged_task 包装在 lambda 中,以便将它们存放在容器中。我在下面写了一个测试代码来模拟包装和调用 lambda 函数。我的代码如下: int test() {
在使用 C++11 的线程模型时,我注意到 std::packaged_task task([](int a, int b) { return a + b; }); auto f = task.get
我是一名优秀的程序员,十分优秀!