Nicht-weitergebender Cache (C++20)
| template< class T > requires std::is_object_v<T> |
(seit C++20) (nur Exposition*) |
|
Einige Bereichsadapter wie ranges::join_view und ranges::lazy_split_view speichern bedingt Werte (z.B. einen Iterator), die in Bezug auf eine exposition-only-Klassenvorlage non-propagating-cache spezifiziert sind.
Der Wrapper verhält sich exakt wie std::optional<T>, außer dass
- er beim Kopieren oder Zuweisen des Quellobjekts dessen Wert nicht kopiert,
- er beim Verschieben des Quellobjekts dessen Wert zurücksetzt,
- er beim Zuweisen seinen eigenen Wert zurücksetzt und
- er zusätzlich eine Member-Funktionstemplate bereitstellt, um einem Eingabebereich das temporäre Caching von Werten während der Iteration zu ermöglichen.
Der Wrapper kapselt einen Cache, der einen Wert enthält. Das Leeren des Caches ist eine Operation, die dem Zurücksetzen eines enthaltenen Wertes entspricht. Eine solche Operation wird beim Kopieren oder Verschieben eines Wrappers ausgeführt.
Inhalt |
[bearbeiten] Vorlagenparameter
| T | - | der Typ des enthaltenen Wertes, muss ein Objekttyp sein |
[bearbeiten] Memberfunktionen
Kopier- und Move-Konstruktoren
| constexpr /*non-propagating-cache*/ ( const /*non-propagating-cache*/& ) noexcept {} |
(1) | (seit C++20) |
| constexpr /*non-propagating-cache*/ ( /*non-propagating-cache*/&& other ) noexcept { other.reset(); } |
(2) | (seit C++20) |
Kopier- und Move-Zuweisungsoperatoren
| constexpr /*non-propagating-cache*/& operator=( const /*non-propagating-cache*/& other ) noexcept |
(1) | (seit C++20) |
| constexpr /*non-propagating-cache*/& operator=( /*non-propagating-cache*/&& other ) noexcept |
(2) | (seit C++20) |
non-propagating-cache<T>::emplace-deref
| template< class I > constexpr T& /*emplace-deref*/( const I& i ); |
(seit C++20) (nur Exposition*) |
|
Initialisiert den enthaltenen Wert durch direkte Initialisierung (aber nicht durch direkte Listeninitialisierung) mit *i. Wenn *this vor dem Aufruf bereits einen Wert enthält, wird reset() aufgerufen.
Gibt eine Referenz auf den neu enthaltenen Wert zurück.
Das Programm ist schlecht geformt, es sei denn, die Deklaration T t(*i); ist für eine erfundene Variable t wohlgeformt. Wenn *i ein Prvalue eines möglicherweise cv-qualifizierten T ist, ist es nicht erforderlich, verschiebbar zu sein.
[bearbeiten] Hinweise
non-propagating-cache wird in Implementierungen verwendet, um das Ergebnis von begin() zu cachen und so eine amortisierte konstante Zeitkomplexität der Methode zu gewährleisten.
[bearbeiten] Siehe auch
| (C++20) |
ein view, der aus der Sequenz besteht, die durch Abflachung eines view von ranges gebildet wird(Klassen-Template) (Range-Adaptor-Objekt) |
ein view, der aus der Sequenz besteht, die durch Abflachung eines Views von Ranges gebildet wird, mit dem Trennzeichen zwischen den Elementen(Klassen-Template) (Range-Adaptor-Objekt) | |
ein view über die Unterbereiche, die durch Aufteilen eines anderen view mit einem Trennzeichen gebildet werden(Klassen-Template) (Range-Adaptor-Objekt) | |
ein view über die Unterbereiche, die durch Aufteilen eines anderen view mit einem Trennzeichen gebildet werden(Klassen-Template) (Range-Adaptor-Objekt) | |
eine Reihe von views, die N-elementige, nicht überlappende, aufeinanderfolgende Blöcke von Elementen einer anderen view sind(Klassenschablone) (Range-Adaptor-Objekt) |