为什么"packaged_task"没有演绎指南?

Why does `packaged_task` not have deduction guides?

本文关键字:quot 演绎 task packaged 为什么      更新时间:2023-10-16

我天真地期望编译:

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;
}

对于 exposition:这可能来自线程池实现,enqueue()只是将参数排队以在工作线程上执行。

然而,问题是,没有packaged_task的演绎指南,所以C++17构造函数模板参数推演当然失败了。

那么,为什么没有演绎指南呢?

三家std::future工厂都没有演绎指南

  • std::async是一个函数模板,因此不需要任何
  • std::promise必须从()推断,这是模棱两可的
  • std::packaged_task必须从潜在的重载函数(和operator()s)中推断出来,这是模棱两可的

请注意,如果你有可调用对象的参数,packaged_task是错误的未来工厂,你只向它的构造函数提供可调用量。您的示例代码可能希望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;
}