Пространства имён
Варианты
Действия

std::ranges::range

Материал из cppreference.com
< cpp‎ | ranges
 
 
Библиотека диапазонов
Доступ к диапазонам
Преобразования диапазонов
(C++23)

Примитивы диапазонов



Обработка висячих итераторов
Концепты диапазонов
Представления

Фабрики диапазонов
Адаптеры диапазонов
Генераторы диапазонов
Объекты адаптеров диапазонов
Объекты замыкания адаптеров диапазонов
Вспомогательные элементы
(до C++23)(C++23)


 
Определено в заголовочном файле <ranges>
template< class T >

concept range = requires(T& t) {
  ranges::begin(t); // сохранение равенства для прямых итераторов
  ranges::end  (t);

};

Концепт range определяет требования к типу, который позволяет выполнять итерацию по своим элементам, предоставляя итератор и ограничитель, которые обозначают элементы диапазона.

[править] Требования семантики

Учитывая выражение E такое, что decltype((E)) равно T, T моделирует range, только если

Примечание. В приведённом выше определении требуемые выражения ranges::begin(t) и ranges::end(t) не требуют неявные варианты выражения.

[править] Примечание

Типичный класс range должен предоставлять только две функции:

  1. Функция-элемент begin(), тип возвращаемого значения которой моделирует input_or_output_iterator.
  2. Функция-элемент end(), тип возвращаемого значения которой моделирует sentinel_for<It>, где It это тип возвращаемого значения begin().

Альтернативно, они могут быть функциями, не являющимися элементами, которые можно найти с помощью поиска, зависящего от аргументов.

[править] Пример

#include <iostream>
#include <ranges>
#include <vector>
 
template <typename T>
struct range_t : private T {
    using T::begin, T::end; /*...*/
};
static_assert(std::ranges::range< range_t<std::vector<int>> >);
 
template <typename T> struct scalar_t { T t{}; /* нет begin/end */ };
static_assert(not std::ranges::range< scalar_t<int> >);
 
int main() {
    if constexpr (range_t<std::vector<int>> r; std::ranges::range<decltype(r)>) {
        std::cout << "r диапазон\n";
    }
 
    if constexpr (scalar_t<int> s; not std::ranges::range<decltype(s)>) {
        std::cout << "s не диапазон\n";
    }
}

Вывод:

r диапазон
s не диапазон