美文网首页
异世相遇 Generic Lambda in C++20

异世相遇 Generic Lambda in C++20

作者: ospacer | 来源:发表于2021-09-19 15:57 被阅读0次

    偶遇

    今日昨日在网上冲浪时偶然遇到lambda表达式的一种新语法,定睛一看,恰好能优雅地解决前段时间的纠结,遂记录之。

    太长不看版直接前往今生并不能跳转的链接

    前世

    自C++11引入lambda表达式以来,lambda表达式就被引入了C++(逃

    在此之后的C++14对其进行了第一次增幅,不仅捕获能力更强,泛化能力也不可同日而语,因此改头换面被称呼为generic lambda。以下是一种用法:

    
    auto func = [](auto a, auto b) { return a + b; };
    
    

    以上等价于

    
    template <typename T1, typename T2>
    
    auto func(T1 a, T2 b)
    
    {
    
    return a + b;
    
    }
    
    

    即使强如generic lambda in C++14也没有做到通常模板函数的泛化能力。以下形式即无法由lambda等价表示:

    
    // case 1
    
    template <typename T>
    
    auto func(T a, T b) { ... }
    
    // case 2
    
    template <typename T, std::size_t N>
    
    auto func(std::array<T, N> const& arr) { ... }
    
    

    而以上case 2正是我所希望以lambda写成的等价形式。

    今生

    当今lambda表达式进一步支持模板参数,大概可以称为generic templated lambda吧(?)

    
    auto lambda = []<typename T>(T a) { ... };
    
    
    • 坏消息是:上述特性需要C++20支持,大多数生产环境未来可期

    • 好消息是:当前手到擒来的VS2019以及ubuntu 20.04中的gcc 9.3均可开启此特性

    对于上面提到的两个case可以分别写做:

    
    auto func = []<typename T>(T a, T b) { ... };  // case 1
    
    auto func = []<typename T, std::size_t N>(std::array<T, N> const& arr) { ... };  // case 2
    
    

    Refs

    1. What is the need of template lambda introduced in C++20 when C++14 already has generic lambda?

    2. Lambdas: From C++11 to C++20, Part 2

    本文仅讨论lambda表达式的泛化能力,关于[]的捕获能力不在本文范围

    相关文章

      网友评论

          本文标题:异世相遇 Generic Lambda in C++20

          本文链接:https://www.haomeiwen.com/subject/lrfpgltx.html