为什么"packaged_task"没有演绎指南?
Why does `packaged_task` not have deduction guides?
我天真地期望编译:
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;
}
相关文章:
- 模板模板参数的演绎指南
- 使用显式模板参数列表和 [temp.arg.explicit]/3 的函数调用的演绎失败
- 提升精神 QI:在元组上自动规则演绎,在替代函数中带有序列
- 类模板专用化演绎是否应该考虑演绎指南参数初始化?
- 演绎指南中的参考文献和值之间的差异
- 'char (*RtlpNumberOf(T (&)[N]))[N]':无法从"char *"
- Arduino IDE 错误 - 无法找到数字文字运算符"运算符""f900ff"
- 为什么 std::array 的演绎指南不允许不同的类型?
- "inline"、"constexpr"或"noexcept"
- 是否有可能通过演绎指南实现整个 std::make_tuple 功能?
- 矩阵的演绎指南
- C++17类模板演绎常性
- "非静态数据成员之前需要构造函数" - 我是否使用"boost::variant"
- C++17模板演绎指南不用于空参数集?
- 我必须安装"libbitcoin-server"才能包含"bitcoin.hpp"
- 如何使用模板化构造函数定义演绎指南?
- 为什么"packaged_task"没有演绎指南?
- 类型演绎 C++ 标准和自动
- C++ 1Z 错误:错误:演绎指南中声明中的显式限定
- λ类型演绎失败