最近发现泛型编程有了另一利器——泛型 Lambda,比想象当中要强大许多,威力不小,和大家分享一下。 本篇内容需要对泛型编程有所了解,若是读过之前更新的相关文章,食用更佳。 泛型编程 开始之前,先来简单回顾一下泛型编程的内容。 泛型编程的目的是将「数据和方法」进行分离,将数据高度抽象,于是可以表示同类问题的「最小通解」。 C++ 通过模板来实现泛型编程,模板又分为变量模板、函数模板和类模板。这些模板始终围绕着「数据和方法」。变量模板属于对数据类型的抽象,函数模板属于对方法的抽象,而类模板,则二者兼有,因为类本身的目的就是将数据和方法进行结合。因此为什么说函数模板处理的是数值,而类模板处理的是类型呢?就是由于函数只具有方法,而在C++中方法是不支持偏特化的,所以它无法处理类型。 至 C++14,Lambda 也迎来了泛化能力,称为 Generic Lambda。不过此时的泛化能力只是由 auto 带来的,威力略弱。随后又经过多年的发展,Lambda 的能力越来越强。C++20 加入了 Template Lambda,这让 Lambda 也可以指定模板参数,使其泛化能力更加完善。 至此,C++ 的泛型编程多了一个新的主角——泛型 Lambda。 泛型 Lambda 为何泛型Lambda值得单独拿出来说呢? 一是因其特殊性,在一些情境使用它来封装变化,会让事情简单许多;二是由其新颖性,它的许多特性和用处尚处探索期,值得讨论。 首先来说其特殊性。Lambda 函数其实就是一个匿名的函数对象,它实际上也是一个“类”。不同的是,它唯一的方法就是 operator(),也就是 Lambda 体,而数据则是 [] 中捕获的参数,这些参数就是“类”中定义的成员变量。因此,Lambda 函数既具有函数的部分特征,又具有类的部分特征。也因如此,事情变得有趣起来。Lambda 具有的函数部分特征,让它具备了函数模板的能力;类部分特征,让它具备了类模板的继承能力。此外,由于 Lambda 的类型是一个 closure type(闭包类型),所以它还可以定义在函数内部,也可以当作回调函数使用。 如此这些,再加上泛型,使得泛型 Lambda 极具威力。 继而来看其新颖性。 当下大多数 C++ 开发者对于 Lambda 的使用,还只是停留在函数部分,相当于只发挥了… Continue Reading 泛型 Lambda,如此强大!

根据提案 P0634-Down with typename,C++20 之后 typename 在有些地方不再必要。 原文主要内容如下: If X::Y — where T is a template parameter — is to denote a type, it must be preceded by the keyword typename; otherwise, it is assumed to denote a name producing an expression. There are currently two notable exceptions to this… Continue Reading 新简化!typename 在 C++20 不再必要