C++模板--packaged_task 如何打包 lambda 和函数指针?

从它的构造函数上看, 似乎不能接受 lambda 和函数指针作为构造函数的参数
但可以通过如下 自定义推导规则 来实现.
这实际上是Deduction Guides技术

//1
template <class _Rp, class... _Args>
packaged_task(_Rp (*)(_Args...)) -> packaged_task<_Rp(_Args...)>;

//2
template <class _Fp, class _Stripped = typename __strip_signature<decltype(&_Fp::operator())>::type>
packaged_task(_Fp) -> packaged_task<_Stripped>;
  1. 如果传入模板实参是函数指针类型 _Rp (*)(_Args...), 那么
    • 被引导为 _Rp(_Args...), 从而使用类模板 packaged_task<_Rp(_Args...)>
  2. 如果传入的模板实参是 lambda 对象的类型 _Fp, 那么
    • decltype(&_Fp::operator()) 解析它的 operator 成员函数指针类型
    • __strip_signature 删除成员函数指针类型的 类签名
    • 最后引导为 _Stripped 类型, 它是函数指针类型
    • 再通过 //1 的引导, 使用类模板 packaged_task<_Rp(_Args...)>
posted @ 2025-01-19 12:33  Ace233  阅读(30)  评论(0)    收藏  举报