Поделиться через


view_interface class (стандартная библиотека C++)

Базовый класс для классов представления в std::ranges пространстве имен. Этот класс реализует некоторый интерфейс для производных типов представлений. Используйте этот класс в качестве базового класса для собственных типов представлений, чтобы уменьшить шаблоны, необходимые для записи.

Синтаксис

template<class Derived>
  requires std::is_class_v<Derived> && 
  std::same_as<Derived, std::remove_cv_t<Derived>>
class view_interface;

Параметры шаблона

Derived
Тип класса, производный от этого базового класса.

Участники

Функции-члены Description
backC++20 Получите последний элемент в производном представлении.
dataC++20 Получите указатель на первый элемент в производном представлении.
emptyC++20 Проверьте, является ли производное представление пустым.
frontC++20 Получите первый элемент в производном представлении.
sizeC++20 Получение количества элементов в производном представлении.
Операторы Description
operator[]C++20 Получите элемент в указанной позиции.
operator boolC++20 Проверьте, не является ли производное представление пустым.

Требования

Заголовок: <ranges> (с C++20)

Пространство имен: std::ranges

Параметр компилятора: /std:c++20 или более поздней версии требуется.

back

Получите последний элемент в производном представлении.

constexpr auto back()
    requires ranges::bidirectional_range<Derived> &&
    ranges::common_range<Derived>;

constexpr auto back() const
    requires ranges::bidirectional_range<const Derived> && 
    ranges::common_range<const Derived>;

Параметры

Нет.

Возвращаемое значение

Последний элемент в производном представлении.

Замечания

Производное представление должно удовлетворять bidirectional_range и common_range.
Поведение и front() не определено для любого пустого back() представления.

data

Получите указатель на первый элемент в производном представлении.

constexpr auto data()
    requires std::contiguous_iterator<ranges::iterator_t<Derived>>;
constexpr auto data() const
    requires ranges::range<const Derived> &&
    std::contiguous_iterator<ranges::iterator_t<const Derived>>;

Параметры

Нет.

Возвращаемое значение

Указатель на первый элемент в производном представлении.

Замечания

Итератор для производного представления должен соответствовать contiguous_iterator.

empty

Проверьте, является ли производное представление пустым.

1) constexpr bool empty() requires ranges::forward_range<Derived>;
2) constexpr bool empty() const requires ranges::forward_range<const Derived>;

Параметры

Нет.

Возвращаемое значение

Возвращает, true если производное представление не имеет элементов. В противном случае возвращается false.

Замечания

Производное представление должно удовлетворять std::ranges::forward_range.

front

Получите первый элемент в производном представлении.

constexpr auto front()
    requires ranges::forward_range<Derived>;
constexpr auto front() const
    requires ranges::forward_range<const Derived>;

Параметры

Нет.

Возвращаемое значение

Последний элемент в производном представлении.

Замечания

Производное представление должно удовлетворять forward_range.
Поведение front() не определено для std::ranges::empty_view.

size

Получение количества элементов в производном представлении.

constexpr auto size() requires ranges::forward_range<Derived> &&
    std::sized_sentinel_for<ranges::sentinel_t<Derived>,
    ranges::iterator_t<Derived>>;
constexpr auto size() const requires ranges::forward_range<const Derived> &&
    std::sized_sentinel_for<ranges::sentinel_t<const Derived>,
    ranges::iterator_t<const Derived>>;

Параметры

Нет.

Возвращаемое значение

Количество элементов в производном представлении.

Замечания

Итератор для производного представления должен соответствовать sized_sentinel_for.

operator[]

Получите элемент в указанной позиции.

template<ranges::random_access_range R = Derived>
constexpr decltype(auto) operator[](ranges::range_difference_t<R> pos);

template<ranges::random_access_range R = const Derived>
constexpr decltype(auto) operator[](ranges::range_difference_t<R> pos) const;

Параметры

pos
Позиция, относительно начального итератора элемента, возвращаемого.

Возвращаемое значение

Элемент в указанной позиции относительно начального итератора.

Замечания

Производное представление должно удовлетворять random_access_range.
Поведение этого оператора не определено для std::ranges::empty_view.

Пример: operator[]

// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v{1, 2, 3, 4, 5};
    std::ranges::drop_view dv = std::views::drop(v, 2);

    for (auto e : dv)
    {
        std::cout << e << ' '; // 3 4 5
    }

    std::cout << "\ndv[1] = " << dv[1];
}
3 4 5
dv[1] = 4

view_interface::operator bool

Проверьте, не является ли производное представление пустым.

explicit constexpr operator bool();
explicit constexpr operator bool() const;

Параметры

Нет.

Возвращаемое значение

Возвращает, false если производное представление не имеет элементов (представление пустое). В противном случае возвращается true (представление не пустое).

Замечания

Итератор для производного представления должен соответствовать std::ranges::forward_iterator.
Этот оператор эквивалентен !empty(). Это упрощает запись if (someRange) {...} , чтобы проверить, есть ли что-то в диапазоне для работы.
Поведение этого оператора не определено для std::ranges::empty_view.

Пример: operator bool

// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v{1, 2, 3, 4, 5};
    std::ranges::filter_view fv = std::views::filter(v, [](int e) { return e > 3; });

    bool isNotEmpty = static_cast<bool>(fv);
    std::cout << "Has elements greater than 3: " << std::boolalpha << isNotEmpty << '\n' >>;
}
Has elements greater than 3: true

См. также

<ranges>
ranges::begin()
ranges::data()
ranges::end()
ranges::empty()
ranges::size()
Просмотр классов