Daily bit(e) C++ #164, Адаптер C++20 для преобразования диапазонов в обычные диапазоны: std::views::common.

До C++20 диапазон был неявным понятием, представленным двумя итераторами. В C++20 эта концепция была формализована и упрощена до итератора и часового.

Чтобы адаптировать диапазон для старого кода, для которого требуется общий диапазон (итератор и часовой один и тот же тип), мы можем использовать представление адаптера std::views::common.

#include <ranges>
#include <numeric>

// std::views::iota(1) is not a common view
auto view = std::views::iota(1) | std::views::take(3);

// Will not compile, view.begin() and view.end() are of different types
// int sum = std::accumulate(view.begin(), view.end(), 0);

auto common_view = view | std::views::common;
int sum = std::accumulate(common_view.begin(), common_view.end(), 0);
// OK, sum == 6

Откройте пример в Compiler Explorer.