Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ range-v3中的视图闭包是什么?_C++_C++20_Range V3_Std Ranges - Fatal编程技术网

C++ range-v3中的视图闭包是什么?

C++ range-v3中的视图闭包是什么?,c++,c++20,range-v3,std-ranges,C++,C++20,Range V3,Std Ranges,在这种情况下: auto pow = [](int i) {return i * i; }; auto closure = ranges::views::transform(pow); closure似乎是一个视图\u closure。我知道最后一行并没有什么意义,因为变换并没有应用到任何地方。实际上,我也可以将一个向量x导入closure,这样它既可以编译又可以正常工作 但是,什么是视图关闭?它是否是一个“类似函数”的对象,希望应用于某个地方?它的语义是什么 我从Eric Niebler的r

在这种情况下:

auto pow = [](int i) {return i * i; };
auto closure = ranges::views::transform(pow);
closure
似乎是一个
视图\u closure
。我知道最后一行并没有什么意义,因为变换并没有应用到任何地方。实际上,我也可以将一个向量
x
导入
closure
,这样它既可以编译又可以正常工作

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

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


我甚至不知道
view\u closure
是供内部使用还是供用户使用。

view\u closure
不是一种类型,而是一个模板。该表达式的确切类型是具有未命名闭包类型(即
decltype(pow)
)的模板的实例化。这是一个实现细节。

range-v3中的
视图_闭包
类模板是C++20中的概念的实现策略:

范围适配器闭包对象是一元函数对象,它接受
可查看的\u范围
参数并返回
视图
。对于范围适配器闭合对象
C
和表达式
R
,例如
decltype((R))
模型
可查看范围
,以下表达式是等效的,并生成一个视图:

C(R)
R | C
给定一个额外的范围适配器闭合对象
D
,表达式
C | D
格式良好,并生成另一个范围适配器闭合对象,以便以下两个表达式等效:

R | C | D
R | (C | D)
transform(f)
的结果是一个范围适配器闭包对象,您可以通过管道作为
r | transform(f)
或通过调用作为
transform(f)(r)
将其应用于一个
可视的\u范围,这两种方法都将为您提供某种类型的
transform\u视图
适配器

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

查看\u闭包
,类模板,是确保类似这样的东西正常工作所必需的:

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


该类模板基本上影响了
操作符|
的功能以及其他功能。只有在创建自己的range Adapter时才需要使用它,否则作为ranges的用户就不需要关心它。

谢谢。我这边的措辞不好。我想接下来的问题是:这个模板实现了什么类型和要求?@giannisgonidelis iirc它可以是
操作符|
的右侧,从而生成一个范围对象,当遍历该对象时,该对象会将转换应用于它被
编辑的范围的元素。我想您正在验证我的观点。你的答案很好!非常感谢!我需要你提供的标准洞察力:)