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.