Namensräume
Varianten
Aktionen

std::ranges::view, std::ranges::enable_view, std::ranges::view_base

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
 
Definiert in der Header-Datei <ranges>
template<class T>
concept view = ranges::range<T> && std::movable<T> && ranges::enable_view<T>;
(1) (seit C++20)
template<class T>

constexpr bool enable_view =

    std::derived_from<T, view_base> || /*is-derived-from-view-interface*/<T>;
(2) (seit C++20)
struct view_base { };
(3) (seit C++20)
1) Das view-Konzept spezifiziert die Anforderungen an einen range-Typ, der geeignete semantische Eigenschaften für die Verwendung in Pipelines von Range-Adaptoren aufweist.
2) Das Variablen-Template enable_view wird verwendet, um anzuzeigen, ob ein range ein view ist. /*is-derived-from-view-interface*/<T> ist true genau dann, wenn T genau eine öffentliche Basisklasse ranges::view_interface<U> für einen Typ U hat und T keine Basisklassen vom Typ ranges::view_interface<V> für einen anderen Typ V hat.
Benutzer können enable_view für cv-unqualifizierte, vom Benutzer definierte Typen, die view modellieren, zu true und für Typen, die dies nicht tun, zu false spezialisieren. Solche Spezialisierungen müssen in konstanten Ausdrücken verwendbar sein und vom Typ const bool sein.
3) Die Ableitung von view_base ermöglicht es range-Typen, view zu modellieren.

Inhalt

[edit] Semantische Anforderungen

1) T modelliert view nur, wenn
  • die Move-Konstruktion von T konstante Zeitkomplexität hat, und
  • wenn N Kopien und/oder Moves von einem T-Objekt durchgeführt werden, das M Elemente enthält, dann haben diese N Objekte eine Zerstörungszeitkomplexität von 𝓞(N+M) (was impliziert, dass ein nach einem Move verändertes view-Objekt eine Zerstörungszeitkomplexität von 𝓞(1) hat), und
  • entweder std::copy_constructible<T> false ist, oder die Kopierkonstruktion von T konstante Zeitkomplexität hat, und
  • entweder std::copyable<T> false ist, oder die Kopierzuweisung von T keine höhere Zeitkomplexität hat als Zerstörung gefolgt von Kopierkonstruktion.

[edit] Spezialisierungen

Spezialisierungen von enable_view für alle Spezialisierungen der folgenden Standard-Templates sind als true definiert

(seit C++26)

[edit] Anmerkungen

Beispiele für view-Typen sind

Ein kopierbarer Container wie std::vector<std::string> erfüllt im Allgemeinen nicht die semantischen Anforderungen von view, da das Kopieren des Containers alle Elemente kopiert, was nicht in konstanter Zeit erfolgen kann.

Obwohl Views ursprünglich als kostengünstig kopierbare und nicht besitzende Ranges beschrieben wurden, muss ein Typ nicht kopierbar oder nicht besitzend sein, um view zu modellieren. Er muss jedoch immer noch kostengünstig zu kopieren (falls er kopierbar ist), zu verschieben, zuzuweisen und zu zerstören sein, damit Range-Adaptoren keine unerwartete Komplexität aufweisen.

Standardmäßig wird ein Typ, der movable und range modelliert, als View betrachtet, wenn er öffentlich und eindeutig von view_base abgeleitet ist oder von genau einer Spezialisierung von std::ranges::view_interface.

[edit] Beispiel

Ein minimaler View.

#include <ranges>
 
struct ArchetypalView : std::ranges::view_interface<ArchetypalView>
{
    int* begin();
    int* end();
};
 
static_assert(std::ranges::view<ArchetypalView>);

[edit] Defect Reports

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
P2325R3 C++20 view erforderte default_initializable erfordert nicht
LWG 3549 C++20 enable_view erkannte keine Vererbung von view_interface erkennt
P2415R2 C++20 die Einschränkung der Zeitkomplexität der Zerstörung war zu streng gelockert