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_range
via 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|
所做的事情。只有在创建自己的范围适配器时才需要使用它,否则作为范围用户不需要关心它。