Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
Definiert im Header <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 eines range -Typs, der geeignete semantische Eigenschaften für die Konstruktion von Range-Adapter-Pipelines besitzt.
2) Die enable_view Variable Template wird verwendet, um anzugeben, 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 besitzt, und T keine Basisklassen vom Typ ranges:: view_interface < V > für einen anderen Typ V besitzt.
Benutzer können enable_view für cv-unqualifizierte, programmdefinierte Typen, die view modellieren, auf true spezialisieren, und für Typen, die dies nicht tun, auf false . Solche Spezialisierungen müssen in konstanten Ausdrücken verwendbar sein und den Typ const bool besitzen.
3) Die Ableitung von view_base ermöglicht es range -Typen, das Konzept view zu modellieren.

Inhaltsverzeichnis

Semantische Anforderungen

1) T modelliert view nur wenn:
  • Move-Konstruktion von T konstante Zeitkomplexität hat, und
  • wenn N Kopien und/oder Moves von einem T Objekt mit M Elementen erstellt werden, dann haben diese N Objekte 𝓞(N+M) Destruktion (was impliziert, dass ein moved-from view Objekt 𝓞(1) Destruktion hat), und
  • entweder std:: copy_constructible < T > false ist, oder Kopierkonstruktion von T konstante Zeitkomplexität hat, und
  • entweder std:: copyable < T > false ist, oder Kopierzuweisung von T keine höhere Zeitkomplexität als Destruktion gefolgt von Kopierkonstruktion hat.

Spezialisierungen

Spezialisierungen von enable_view für alle Spezialisierungen der folgenden Standardtemplates sind als true definiert:

(seit C++26)

Hinweise

Beispiele für view -Typen sind:

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

Während Views ursprünglich als kostengünstig kopierbare und nicht-besitzende Ranges beschrieben wurden, muss ein Typ nicht kopierbar oder nicht-besitzend sein, um das Konzept view zu modellieren. Allerdings muss er weiterhin kostengünstig zu kopieren (falls kopierbar), bewegen, zuweisen und zerstören sein, damit range adaptors keine unerwarteten Komplexitätsanforderungen haben.

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

Beispiel

Eine Mindestansicht.

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

Fehlerberichte

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

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