C++ benannte Anforderungen: RangeAdaptorObject (seit C++20)
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
Edecltype((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
- a(args...),
- std::as_const(a)(args...),
- std::move(a)(args...) und
- std::move(std::as_const(a))(args...)
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.