gpt4 book ai didi

c++ - 为什么 `packaged_task`没有推导指南?

转载 作者:行者123 更新时间:2023-11-30 03:24:09 27 4
gpt4 key购买 nike

我天真地期望它能编译:

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com