如何解决什么是 range-v3 中的 view_closure?
在这种情况下:
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
是供内部使用还是供用户使用。
解决方法
range-v3 中的 view_closure
类模板是 C++20 中的实现策略成为 range adaptor closure object 概念:
范围适配器闭包对象是一个一元函数对象,它接受一个 viewable_range
参数并返回一个 view
。对于范围适配器闭包对象 C
和表达式 R
使得 decltype((R))
模型 viewable_range
,以下表达式是等效的并产生视图:
C(R)
R | C
给定一个额外的范围适配器闭包对象 D
,表达式 C | D
是格式良好的,并产生另一个范围适配器闭包对象,使得以下两个表达式是等价的:
R | C | D
R | (C | D)
transform(f)
的结果是一个范围适配器闭包对象,您可以通过管道作为 viewable_range
或通过调用作为 r | transform(f)
将其应用于 transform(f)(r)
,或者这将为您提供某种 transform_view
适配器。
更广泛地说,transform
本身是一个范围适配器对象,其定义方式使得 transform(f)
为您提供一个范围适配器闭包对象,使得 {{1} }、transform(r,f)
和 r | transform(f)
都是等价的。
transform(f)(r)
,类模板,对于确保这样的东西起作用是必要的:
view_closure
也就是说,您可以在没有范围的情况下构建管道,其结果是一个范围适配器闭包对象,然后您可以将其应用于范围 - auto adaptor = transform(f) | filter(g) | chunks(n);
将等效于 {{1} } 相当于 r | adaptor
。
该类模板主要影响 r | transform(f) | filter(g) | chunks(n)
的作用等。只有在创建自己的范围适配器时才需要使用它,否则作为范围的用户不需要关心它。
view_closure
不是类型,它是一个模板。该表达式的确切类型是该模板的实例化,具有未命名的闭包类型(即 decltype(pow)
)。这是一个实现细节。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。