[英]Can I pipe to range-v3 accumulate?
我发现 3 年前的旧问题说一般来说这是不可能的,但我真的很想累积,因为在某些情况下它非常好,例如:
const double val = data | transform(...) | accumulate (...);
所以我想知道是否在 range-v3/C++20 范围中添加了一些东西,使我能够做到这一点。
不。
您可以通过管道输入的唯一内容是范围适配器——输入范围并生成范围的算法。 接受范围并返回单个对象的算法(也称为 catamorphisms)在 range-v3 或 C++20 范围内不可管道化。
你必须这样写:
const double val = accumulate(data | transform(...));
至于为何accumulate
和类似的算法将努力永远|
-有能力的。 考虑我们想要algo(rng, x)
和rng | algo(x)
rng | algo(x)
表示同样的事情。 此外,考虑到“总调用” algo(rng, x)
可以被完全约束(因为你拥有所有信息)而“部分调用” algo(x)
基本上必须在除极少数情况下完全不受约束。 . 基本上大致走auto&&...
问题是当第二个参数x
也可以是一个范围时,我们必然会遇到歧义。 您如何区分意图是全部调用还是部分调用?
这是一个使用string
的示例:
accumulate("hello"s, ""s)
这是一个总调用,它使用默认的二元运算符+
- 字符串连接。 它的作用是遍历char
范围内的元素,并将它们一一添加到初始空字符串中。 这是一种低效但正确的方法来复制string
。 你最终得到值"hello"s
。
它的等效管道版本怎么样?
"hello"s | accumulate(""s)
右手边是什么意思? 可以accumulate(""s)
被认为是一个总调用? 是的,它可以! 默认的第二个参数是char()
,默认的第三个参数是plus()
,这很好用,所以accumulate(""s)
是整数0
- 使整个表达式格式错误,因为没有operator|(string, int)
。
你如何使这个工作与accumulate
?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.