簡體   English   中英

c++20 范圍是否有任何不返回值的視圖函數?

[英]Does c++20 ranges have any view functions that do not return value?

我可以使用 std::views::transform 創建新stream-style容器,然后打印它,如下所示:

#include<iostream>
#include<vector>
#include<ranges>
using namespace std;
int main() {
    // clang -std=c++20
    std::vector<int> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    auto output = input 
        | std::views::filter([](const int n) {return n % 3 == 0; })
        | std::views::transform([](const int n) {return n * n; });
    for (auto o : output) {
        cout << o << endl;
    }
    return 0;
}

是的,它可以工作,但我希望簡單地將我for循環寫入由|連接的管道中。 ,有沒有辦法將代碼更改為:

input 
        | std::views::filter([](const int n) {return n % 3 == 0; })
        | std::views::transform([](const int n) {return n * n; })
        | std::views::SOME_FUNCTION(cout<<n<<endl);

這避免了我for循環。

所以我的問題是: std::views是否有 SOME_FUNCTION 可以滿足我的需求?

您正在尋找的不是視圖。 其實我不完全確定你在找什么,但也許它是std::ranges::for_each

#include<iostream>
#include<vector>
#include<ranges>
#include <algorithm>
using namespace std;
int main() {
    // clang -std=c++20
    std::vector<int> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    
    std::ranges::for_each(input 
        | std::views::filter([](const int n) {return n % 3 == 0; })
        | std::views::transform([](const int n) {return n * n; }),
        [](auto x){std::cout << x << endl;});
}

C++20(或 C++23)中沒有這樣的適配器。 我還發現這個特性缺失了,因為它可以讓程序員轉向更一致和更“純粹”的函數式風格,而不是通過管道 ( | ) 組合表達式,然后在循環中使用它。

最終,我希望std::views::for_each (或者可能是std::actions::for_each ,如果actions符合標准)可以做到這一點。 截至目前,您可以實現自己的可管道的for_each ,但不幸的是,這不會像人們希望的那樣標准

因此,目前最安全的做法是堅持基於范圍的for循環或std::ranges::for_each

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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