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