使用 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)
函数?
这不能直接用
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);
});