Daily bit(e) C++. std::views::common
Добавлено 28 октября 2026 в 00:41
Daily bit(e) C++ 164, адаптер из C++20 для преобразования диапазонов в «общие» диапазоны – std::views::common.

До появления C++20 понятие «диапазон» (range) было неформальным и представлялось парой итераторов. В C++20 это понятие было формализовано и расширено: теперь оно определяется итератором и «стражем»/маркером конца (sentinel).
Чтобы адаптировать диапазон для устаревшего кода, требующего «общий» диапазон (где итератор и маркер конца имеют один и тот же тип), можно воспользоваться адаптером std::views::common.
#include <ranges>
#include <numeric>
// std::views::iota(1) - это не "общее" представление
auto view = std::views::iota(1) | std::views::take(3);
// Не скомпилируется, view.begin() и view.end() имеют разные типы
// 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
