std::ranges:: view_interface
|
Definiert im Header
<ranges>
|
||
|
template
<
class
D
>
requires
std::
is_class_v
<
D
>
&&
std::
same_as
<
D,
std::
remove_cv_t
<
D
>>
|
(seit C++20) | |
std::ranges::view_interface
ist eine Hilfsklassenvorlage zur Definition einer View-Schnittstelle.
view_interface
wird typischerweise mit
CRTP
verwendet:
class my_view : public std::ranges::view_interface<my_view> { public: auto begin() const { /*...*/ } auto end() const { /*...*/ } // empty() wird bereitgestellt, wenn begin() einen Forward-Iterator zurückgibt // und end() einen Sentinel dafür zurückgibt. };
Inhaltsverzeichnis |
Memberfunktionen
gibt zurück, ob die abgeleitete Ansicht leer ist, bereitgestellt nur wenn sie
sized_range
oder
forward_range
erfüllt
(öffentliche Elementfunktion) |
|
|
(C++23)
|
gibt einen konstanten Iterator zum Anfang des Bereichs zurück
(öffentliche Elementfunktion) |
|
(C++23)
|
gibt einen Sentinel für den konstanten Iterator des Bereichs zurück
(öffentliche Elementfunktion) |
|
gibt zurück, ob die abgeleitete Ansicht nicht leer ist, bereitgestellt nur wenn
ranges::empty
darauf anwendbar ist
(öffentliche Elementfunktion) |
|
ruft die Adresse der Daten der abgeleiteten Ansicht ab, bereitgestellt nur wenn ihr Iteratortyp
contiguous_iterator
erfüllt
(öffentliche Elementfunktion) |
|
gibt die Anzahl der Elemente in der abgeleiteten Ansicht zurück. Bereitgestellt wenn sie
forward_range
erfüllt und ihr Sentinel- und Iteratortyp
sized_sentinel_for
erfüllen.
(öffentliche Elementfunktion) |
|
gibt das erste Element in der abgeleiteten Ansicht zurück, bereitgestellt wenn sie
forward_range
erfüllt
(öffentliche Elementfunktion) |
|
gibt das letzte Element in der abgeleiteten Ansicht zurück, bereitgestellt nur wenn sie
bidirectional_range
und
common_range
erfüllt
(öffentliche Elementfunktion) |
|
gibt das
n
te
Element in der abgeleiteten Ansicht zurück, bereitgestellt nur wenn sie
random_access_range
erfüllt
(öffentliche Elementfunktion) |
Beispiel
#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}; // Wir können mit begin() und end() iterieren. for (int n : view_over_v) std::cout << n << ' '; std::cout << '\n'; // Wir erhalten operator[] automatisch durch Vererbung von view_interface // da wir das random_access_range Konzept erfüllen. for (std::ptrdiff_t i = 0; i != view_over_v.size(); ++i) std::cout << "v[" << i << "] = " << view_over_v[i] << '\n'; }
Ausgabe:
1 4 9 16 v[0] = 1 v[1] = 4 v[2] = 9 v[3] = 16
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 3549 | C++20 |
view_interface
musste von
view_base
abgeleitet sein,
was manchmal mehrere
view_base
Unterobjekte in einer View erforderte
|
Vererbung entfernt |
Siehe auch
|
(C++20)
|
kombiniert ein Iterator-Sentinel-Paar zu einer
view
(Klassentemplate) |