August 2021
Intermediate to advanced
450 pages
5h 35m
Chinese
在6.3.2节中,我们将Less_than的定义和使用分离开来。这样做看起来有点不方便,因此,C++提供了一种隐式生成函数对象的表示方法:
[&](int a){return a<x;}这种表示方法被称为lambda表达式(lambda expression),它生成一个与Less_than<int>{x}完全一样的函数对象。[&]是一个捕获列表(capture list),它指出lambda体中使用的所有局部名字(如x)将通过引用访问。如果希望只“捕获”x,则可以写成[&x];如果希望给生成的函数对象传递一个x的拷贝,则写成[=x]。什么也不捕获是[],捕获所有通过引用访问的局部名字是[&],捕获所有以值访问的局部名字是[=]。
虽然使用lambda简单便捷,但也有些晦涩难懂。对于复杂的操作(比如说,不是简单的一条表达式),我们更愿意给该操作起个名字,以便于更加清晰地表述它的目的并且在程序中很多地方使用它。
在4.5.3节中,我们注意到一个很恼人的事情,我们不得不编写很多像draw_all()和rotate_all()这样的函数来执行针对指针vector或unique_ptr vector中元素的操作。函数对象(尤其是lambda)有助于解决这一问题,它令我们能将容器的遍历和对每个元素的具体操作分离开来。
首先,需要定义一个函数,它负责对指针容器的元素指向的每个对象执行特定操作:
接下来,改写4.5节中的user(),而无须编写一大堆_all()函数: ...
Read now
Unlock full access