NoS*_*tAl 6 c++ range-v3 c++20
我发现 3 年前的旧问题说一般来说这是不可能的,但我真的很想累积,因为在某些情况下它非常好,例如:
const double val = data | transform(...) | accumulate (...);
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否在 range-v3/C++20 范围中添加了一些东西,使我能够做到这一点。
不。
您可以通过管道输入的唯一内容是范围适配器——输入范围并生成范围的算法。接受范围并返回单个对象的算法(也称为 catamorphisms)在 range-v3 或 C++20 范围内不可管道化。
你必须这样写:
const double val = accumulate(data | transform(...));
Run Code Online (Sandbox Code Playgroud)
至于为什么accumulate和类似的算法将难以|实现。考虑到我们想要algo(rng, x)和rng | algo(x)意味着同样的事情。此外,考虑到“总调用”algo(rng, x)可以完全约束(因为您拥有所有信息),而“部分调用”algo(x)基本上必须在除极少数情况下完全不受约束......基本上大致采取auto&&...
问题是,我们必然遇到歧义时,第二个参数x,可也有一个范围。您如何区分意图是全部调用还是部分调用?
这是一个使用示例string:
accumulate("hello"s, ""s)
Run Code Online (Sandbox Code Playgroud)
这是一个总调用,它使用默认的二元运算符+- 即字符串连接。它的作用是遍历chars范围内的元素,并将它们一一添加到初始空字符串中。这是一种低效但正确的复制string. 你最终得到了价值"hello"s。
它的等效管道版本怎么样?
"hello"s | accumulate(""s)
Run Code Online (Sandbox Code Playgroud)
右手边是什么意思?能accumulate(""s)算总叫吗?是的,它可以!默认的第二个参数是char(),默认的第三个参数是plus(),这很好用,所以 的值accumulate(""s)是整数0- 使整个表达式格式错误,因为没有operator|(string, int).
你如何使这个工作accumulate?
| 归档时间: |
|
| 查看次数: |
448 次 |
| 最近记录: |