range-v3 中的 view_closure 是什么?

joh*_*lis 4 c++ range-v3 c++20 std-ranges

在这样的情况下:

auto pow = [](int i) {return i * i; };
auto closure = ranges::views::transform(pow);
Run Code Online (Sandbox Code Playgroud)

closure似乎是一个view_closure. 我确实知道最后一行没有多大意义,因为变换没有应用于任何地方。实际上,我也可以将向量输入x其中closure,它既可以编译又可以正常工作

但是,什么视图关闭?它是一个“类似函数”的对象,希望在某个地方应用吗?它的语义是什么?

我从 Eric Niebler 的源代码中找到了这一点range-v3,但在其他地方没有任何文档指定它。

我什至不知道view_closure是供内部使用还是供用户使用。

Bar*_*rry 5

range-v3 中的类view_closure模板是 C++20 中成为范围适配器闭包对象概念的实现策略:

\n
\n

范围适配器闭包对象是一个一元函数对象,它接受viewable_range参数并返回view. 对于范围适配器闭包对象和诸如models的C表达式,以下表达式是等效的并产生视图:Rdecltype((R))viewable_\xc2\xadrange

\n
C(R)\nR | C\n
Run Code Online (Sandbox Code Playgroud)\n

给定一个附加的范围适配器闭包对象D,该表达式C | D是格式良好的,并生成另一个范围适配器闭包对象,使得以下两个表达式是等效的:

\n
R | C | D\nR | (C | D)\n
Run Code Online (Sandbox Code Playgroud)\n
\n

其结果transform(f)是一个范围适配器闭包对象,您可以将其应用于viewable_rangevia pipeline asr | transform(f)或 via call as transform(f)(r),其中任何一个都会为您提供某种transform_view适配器。

\n

更广泛地说,transform它本身是一个范围适配器对象,它的定义方式为transform(f)您提供一个范围适配器闭包对象,使得transform(r, f)r | transform(f)、 和transform(f)(r)都是等效的。

\n

view_closure类模板对于确保像这样的东西有效是必要的:

\n
C(R)\nR | C\n
Run Code Online (Sandbox Code Playgroud)\n

也就是说,您可以在没有范围的情况下构建管道,其结果是一个范围适配器闭包对象,然后您可以将其应用于范围r | adaptor-r | transform(f) | filter(g) | chunks(n)相当于chunks(filter(transform(r, f), g), n).

\n

该类模板基本上影响了operator|其他事情。仅当您创建自己的范围适配器时才需要使用它,否则作为范围用户不需要关心它。

\n