簡體   English   中英

我可以通過管道傳輸到 range-v3 累積嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM