std::ranges::view_interface
Von de.cppreference.net
| Definiert im Header <ranges>
|
||
template< class D >
requires std::is_class_v<D> && std::same_as<D, std::remove_cv_t<D>>
class view_interface;
|
(seit C++20) | |
std::ranges::view_interface ist eine Hilfsklassen-Schablone zur Definition einer Ansichtsschnittstelle.
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() is provided if begin() returns a forward iterator
// and end() returns a sentinel for it.
};
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
Diesen Code ausführen
#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) |