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 @   Ace233  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示
主题色彩