std::ranges::view_interface
Определён в заголовочном файле <ranges> | ||
|---|---|---|
template< class D >
requires std::is_class_v<D> && std::same_as<D, std::remove_cv_t<D>>
class view_interface;
| (начиная с C++20) |
std::ranges::view_interface — это вспомогательный шаблон класса для определения интерфейса представления.
view_interface обычно используется с CRTP:
class my_view : public std::ranges::view_interface<my_view>
{
public:
auto begin() const { /*...*/ }
auto end() const { /*...*/ }
// empty() is provided if begin() returns a forward iterator
// and end() returns a sentinel for it.
};
Функции-члены
возвращает, является ли производное представление пустым; доступен только в том случае, если оно удовлетворяет требованиям sized_range или forward_range (открытая функция-член) |
|
|
(C++23) | возвращает константный итератор на начало диапазона (открытая функция-член) |
|
(C++23) | возвращает сентинел для константного итератора диапазона (открытая функция-член) |
возвращает, не является ли производное представление пустым; доступен только в том случае, если к нему применимо ranges::empty (открытая функция-член) |
|
получает адрес данных производного представления; доступен только в том случае, если тип его итератора удовлетворяет требованиям contiguous_iterator (открытая функция-член) |
|
возвращает количество элементов в производном представлении. Доступен, если оно удовлетворяет требованиям forward_range, а его сентинел и тип итератора удовлетворяют требованиям sized_sentinel_for. (открытая функция-член) |
|
возвращает первый элемент производного представления; доступен, если оно удовлетворяет требованиям forward_range (открытая функция-член) |
|
возвращает последний элемент производного представления; доступен только в том случае, если оно удовлетворяет требованиям bidirectional_range и common_range (открытая функция-член) |
|
возвращает элемент производного представления с индексом nth; доступен только в том случае, если оно удовлетворяет требованиям random_access_range (открытая функция-член) |
Пример
#include <iostream>
#include <ranges>
#include <vector>
template<class T, class A>
class VectorView : public std::ranges::view_interface<VectorView<T, A>>
{
public:
VectorView() = default;
VectorView(const std::vector<T, A>& vec) :
m_begin(vec.cbegin()), m_end(vec.cend())
{}
auto begin() const { return m_begin; }
auto end() const { return m_end; }
private:
typename std::vector<T, A>::const_iterator m_begin{}, m_end{};
};
int main()
{
std::vector<int> v = {1, 4, 9, 16};
VectorView view_over_v{v};
// We can iterate with begin() and end().
for (int n : view_over_v)
std::cout << n << ' ';
std::cout << '\n';
// We get operator[] for free when inheriting from view_interface
// since we satisfy the random_access_range concept.
for (std::ptrdiff_t i = 0; i != view_over_v.size(); ++i)
std::cout << "v[" << i << "] = " << view_over_v[i] << '\n';
}
Вывод:
1 4 9 16 v[0] = 1 v[1] = 4 v[2] = 9 v[3] = 16
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применяется к | Опубликованное поведение | Правильное поведение |
|---|---|---|---|
| LWG 3549 | C++20 |
view_interface должен был наследоваться от view_base,что иногда требовало наличия нескольких подобъектов view_base в представлении | наследование удалено |
См. также
|
(C++20) | объединяет пару «итератор — сентинел» в view (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/view_interface