range-v3 中的 view_closure 是什么?
What is a view_closure in range-v3?
在这种情况下:
auto pow = [](int i) {return i * i; };
auto closure = ranges::views::transform(pow);
closure
好像是个view_closure
。我确实知道最后一行没有多大意义,因为转换没有应用到任何地方。 实际上,我还可以将一个向量 x
通过管道传输到 closure
中,它既可以编译又可以正常工作。
但是,什么是视图闭包?它是一个期望在某处应用的“类似函数”的对象吗?它的语义是什么?
我从 Eric Niebler 的 range-v3
源代码中找到 this,但没有任何文档在其他地方指定它。
我什至不知道 view_closure
是供内部使用还是供用户使用。
view_closure
不是 类型 ,它是一个模板。该表达式的确切类型是具有未命名闭包类型(即 decltype(pow)
)的该模板的实例化。这是一个实现细节。
range-v3 中的 view_closure
class 模板是 C++20 中成为 range adaptor closure object 概念的实现策略:
A range adaptor closure object is a unary function object that accepts a viewable_range
argument and returns a view
. For a range adaptor closure object C
and an expression R
such that decltype((R))
models viewable_range
, the following expressions are equivalent and yield a view:
C(R)
R | C
Given an additional range adaptor closure object D
, the expression C | D
is well-formed and produces another range adaptor closure object such that the following two expressions are equivalent:
R | C | D
R | (C | D)
transform(f)
的结果是一个范围适配器闭包对象,您可以通过管道作为 r | transform(f)
或通过调用作为 transform(f)(r)
将其应用于 viewable_range
,其中任何一个都会给你某种 transform_view
适配器。
更广泛地说,transform
本身是一个 范围适配器对象 ,其定义方式使得 transform(f)
为您提供范围适配器闭包对象,例如transform(r, f)
、r | transform(f)
和 transform(f)(r)
都是等价的。
view_closure
,class 模板,是确保像这样的东西有效所必需的:
auto adaptor = transform(f) | filter(g) | chunks(n);
也就是说,您可以在没有范围的情况下构建管道,其结果是一个范围适配器闭包对象,然后您可以将其应用于范围 - r | adaptor
等同于 r | transform(f) | filter(g) | chunks(n)
相当于 chunks(filter(transform(r, f), g), n)
.
那个 class 模板基本上会影响 operator|
的作用,等等。只有在创建自己的范围适配器时才需要使用它,否则作为范围用户不需要关心它。
在这种情况下:
auto pow = [](int i) {return i * i; };
auto closure = ranges::views::transform(pow);
closure
好像是个view_closure
。我确实知道最后一行没有多大意义,因为转换没有应用到任何地方。 实际上,我还可以将一个向量 x
通过管道传输到 closure
中,它既可以编译又可以正常工作。
但是,什么是视图闭包?它是一个期望在某处应用的“类似函数”的对象吗?它的语义是什么?
我从 Eric Niebler 的 range-v3
源代码中找到 this,但没有任何文档在其他地方指定它。
我什至不知道 view_closure
是供内部使用还是供用户使用。
view_closure
不是 类型 ,它是一个模板。该表达式的确切类型是具有未命名闭包类型(即 decltype(pow)
)的该模板的实例化。这是一个实现细节。
range-v3 中的 view_closure
class 模板是 C++20 中成为 range adaptor closure object 概念的实现策略:
A range adaptor closure object is a unary function object that accepts a
viewable_range
argument and returns aview
. For a range adaptor closure objectC
and an expressionR
such thatdecltype((R))
modelsviewable_range
, the following expressions are equivalent and yield a view:C(R) R | C
Given an additional range adaptor closure object
D
, the expressionC | D
is well-formed and produces another range adaptor closure object such that the following two expressions are equivalent:R | C | D R | (C | D)
transform(f)
的结果是一个范围适配器闭包对象,您可以通过管道作为 r | transform(f)
或通过调用作为 transform(f)(r)
将其应用于 viewable_range
,其中任何一个都会给你某种 transform_view
适配器。
更广泛地说,transform
本身是一个 范围适配器对象 ,其定义方式使得 transform(f)
为您提供范围适配器闭包对象,例如transform(r, f)
、r | transform(f)
和 transform(f)(r)
都是等价的。
view_closure
,class 模板,是确保像这样的东西有效所必需的:
auto adaptor = transform(f) | filter(g) | chunks(n);
也就是说,您可以在没有范围的情况下构建管道,其结果是一个范围适配器闭包对象,然后您可以将其应用于范围 - r | adaptor
等同于 r | transform(f) | filter(g) | chunks(n)
相当于 chunks(filter(transform(r, f), g), n)
.
那个 class 模板基本上会影响 operator|
的作用,等等。只有在创建自己的范围适配器时才需要使用它,否则作为范围用户不需要关心它。