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.
};Члены
|
(C++20) | возвращает значение, указывающее, является ли производное представление пустым. Предоставляется, если оно удовлетворяет sized_range или forward_range. (публичный метод) |
|
(C++23) | возвращает константный итератор в начало диапазона. (публичный метод) |
|
(C++23) | возвращает конечный итератор для константного итератора диапазона. (публичный метод) |
|
(C++20) | возвращает значение, указывающее, является ли производное представление не пустым. Предоставляется, если ranges::empty применимо к нему. (публичный метод) |
|
(C++20) | получает адрес данных производного представления. Предоставляется, если тип его итератора удовлетворяет contiguous_iterator. (публичный метод) |
|
(C++20) | возвращает количество элементов в производном представлении. Предоставляется, если оно удовлетворяет forward_range и его конечный итератор и тип итератора удовлетворяют sized_sentinel_for. (публичный метод) |
|
(C++20) | возвращает первый элемент в производном представлении. Предоставляется, если оно удовлетворяет forward_range. (публичный метод) |
|
(C++20) | возвращает последний элемент в производном представлении. Предоставляется, если оно удовлетворяет bidirectional_range и common_range. (публичный метод) |
|
(C++20) | возвращает n-й элемент в производном представлении. Предоставляется, если оно удовлетворяет 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/w/cpp/ranges/view_interface