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它可以是操作符|
的右侧,从而生成一个范围对象,当遍历该对象时,该对象会将转换应用于它被
编辑的范围的元素。我想您正在验证我的观点。你的答案很好!非常感谢!我需要你提供的标准洞察力:)