Namensräume
Varianten
Aktionen

Nicht-weitergebender Cache (C++20)

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
Hilfselemente
(bis C++23)  (C++23)
non-propagating-cache


 
template< class T >

    requires std::is_object_v<T>

class /*non-propagating-cache*/;
(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)
1) Der Kopierkonstruktor hat keine Auswirkung.
2) Der Move-Konstruktor leert den Cache von other.

Kopier- und Move-Zuweisungsoperatoren

constexpr /*non-propagating-cache*/&

    operator=( const /*non-propagating-cache*/& other ) noexcept
{
    if (std::addressof(other) != this)
        reset();
    return *this;

}
(1) (seit C++20)
constexpr /*non-propagating-cache*/&

    operator=( /*non-propagating-cache*/&& other ) noexcept
{
    reset();
    other.reset();
    return *this;

}
(2) (seit C++20)
1) Der Kopierzuweisungsoperator leert den Cache von *this.
2) Der Move-Zuweisungsoperator leert die Caches von sowohl *this als auch other.

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.

Mitglieder identisch mit std::optional

Memberfunktionen

konstruiert das optional-Objekt
(public member function of std::optional<T>) [bearbeiten]
zerstört den enthaltenen Wert, falls vorhanden
(public member function of std::optional<T>) [bearbeiten]
weist Inhalte zu
(public member function of std::optional<T>) [bearbeiten]
Observer
greift auf den enthaltenen Wert zu
(public member function of std::optional<T>) [bearbeiten]
prüft, ob das Objekt einen Wert enthält
(public member function of std::optional<T>) [bearbeiten]
Modifizierer
zerstört jeden enthaltenen Wert
(public member function of std::optional<T>) [bearbeiten]
konstruiert den enthaltenen Wert in-place
(public member function of std::optional<T>) [bearbeiten]

[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

ein view, der aus der Sequenz besteht, die durch Abflachung eines view von ranges gebildet wird
(Klassen-Template) (Range-Adaptor-Objekt)[edit]
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)[edit]
ein view über die Unterbereiche, die durch Aufteilen eines anderen view mit einem Trennzeichen gebildet werden
(Klassen-Template) (Range-Adaptor-Objekt)[edit]
ein view über die Unterbereiche, die durch Aufteilen eines anderen view mit einem Trennzeichen gebildet werden
(Klassen-Template) (Range-Adaptor-Objekt)[edit]
eine Reihe von views, die N-elementige, nicht überlappende, aufeinanderfolgende Blöcke von Elementen einer anderen view sind
(Klassenschablone) (Range-Adaptor-Objekt)[bearbeiten]