如何将 std::views::zip 与 std::ranges::for_each 一起使用?

问题描述 投票:0回答:1

使用 C++ foreach 循环我们可以这样写:

void process(int i);
...
for(auto i : items)
    process(i);

对于 C++20 中的范围,可以写为:

std::ranges::for_each(items, process);

在 C++23 中使用

std::views::zip
我们可以写:

void process(int a, int b);
for(auto [a, b] : std::views::zip(itemsA, itemsB))
    process(a, b);

如何使用

std::ranges::for_each
来调用原来的
process(int, int)
函数?

c++ foreach std-ranges
1个回答
0
投票

这不能直接用

std::ranges::for_each
编写,因为
std::views::zip
会产生“类似元组”的值。相反,
process()
需要重写:

void process(std::tuple<int, int> t);
...
std::ranges::for_each(std::views::zip(itemsA, itemsB), process);

std::apply()
:

std::ranges::for_each(std::views::zip(itemsA, itemsB),
                      [](auto t){
                          std::apply(process, t);
                      });

但此时,lambda 也可以直接扩展元组,就像在原始 for 循环中一样:

std::ranges::for_each(std::views::zip(itemsA, itemsB),
                      [](auto [a, b]){
                          process(a, b);
                      });
© www.soinside.com 2019 - 2024. All rights reserved.