Namensräume
Varianten
Aktionen

C++ benannte Anforderungen: RangeAdaptorObject (seit C++20)

Von cppreference.com
 
 
C++ benannte Anforderungen
 

Range-Adapter-Objekte sind Customization-Point-Objekte, die viewable_range als ihr erstes Argument entgegennehmen und eine view zurückgeben. Einige Range-Adapter-Objekte sind unär, d.h. sie nehmen ein viewable_range als einziges Argument. Andere Range-Adapter-Objekte nehmen ein viewable_range und weitere nachfolgende Argumente entgegen.

Wenn ein Range-Adapter-Objekt nur ein Argument entgegennimmt, ist es auch ein RangeAdaptorClosureObject.

Wenn ein Range-Adapter-Objekt mehr als ein Argument entgegennimmt, unterstützt es auch die partielle Anwendung: sei

  • a ein solches Range-Adapter-Objekt und
  • args... seien Argumente (im Allgemeinen geeignet für nachfolgende Argumente),

hat der Ausdruck a(args...) folgende Eigenschaften:

  • Er ist genau dann gültig, wenn für jedes Argument e in args..., wobei E decltype((e)) ist, gilt std::is_constructible_v<std::decay_t<E>, E> ist true,
  • wenn der Aufruf gültig ist, speichert sein Ergebnisobjekt ein Unterobjekt vom Typ std::decay_t<E>, das direkt nicht-list-initialisiert ist mit std::forward<E>(e), für jedes Argument e in args... (mit anderen Worten, Range-Adapter-Objekte binden Argumente per Wert),
  • das Ergebnisobjekt ist ein RangeAdaptorClosureObject,
  • das Aufrufen des RangeAdaptorClosureObject leitet die gebundenen Argumente (falls vorhanden) an das zugehörige Range-Adapter-Objekt weiter. Die gebundenen Argumente (falls vorhanden) gelten als mit der Wertkategorie und cv-Qualifikation des RangeAdaptorClosureObject ausgestattet. Mit anderen Worten, a(args...)(r) ist äquivalent zu std::bind_back(a, args...)(r) (aber ersteres unterstützt auch die Pipe-Syntax).(seit C++23)

Wie andere Customization Point Objects, sei

  • a ein Objekt der cv-unqualifizierten Version des Typs eines beliebigen Range-Adapter-Objekts,
  • args... eine beliebige Gruppe von Argumenten, die die Einschränkungen des operator() des Typs von a erfüllt,

sind Aufrufe von

alle äquivalent.

Das Ergebnisobjekt jeder dieser Ausdrücke ist entweder ein view-Objekt oder ein RangeAdaptorClosureObject.

[bearbeiten] Hinweise

operator() wird für die volatile-qualifizierten oder const-volatile-qualifizierten Versionen von Range-Adapter-Objekttypen nicht unterstützt. Arrays und Funktionen werden beim Binden in Zeiger konvertiert.