range-v3 中的view_closure类模板是 C++20 中成为范围适配器闭包对象概念的实现策略:
范围适配器闭包对象是一个一元函数对象,它接受一个viewable_range参数并返回一个view. 对于范围适配器闭包对象C和R诸如decltype((R))models的表达式viewable_range,以下表达式是等价的并产生一个视图:
C(R)
R | C
给定一个额外的范围适配器闭包对象D,该表达式C | D是格式良好的,并产生另一个范围适配器闭包对象,因此以下两个表达式是等价的:
R | C | D
R | (C | D)
的结果transform(f)是一个范围适配器闭包对象,您可以将其应用于viewable_rangevia pipe asr | transform(f)或 via call as transform(f)(r),其中任何一个都会为您提供某种transform_view适配器。
更广泛地说,transform它本身是一个范围适配器对象,它的定义方式transform(f)为给您一个范围适配器闭包对象,这样transform(r, f)、r | transform(f)和transform(f)(r)都是等价的。
view_closure,类模板,对于确保这样的东西起作用是必要的:
auto adaptor = transform(f) | filter(g) | chunks(n);
也就是说,您可以在没有范围的情况下构建管道,其结果是范围适配器闭包对象,然后您可以将其应用于范围-r | adaptor相当于.r | transform(f) | filter(g) | chunks(n)chunks(filter(transform(r, f), g), n)
除其他外,该类模板基本上会影响operator|所做的事情。只有在创建自己的范围适配器时才需要使用它,否则作为范围用户不需要关心它。