Namespaces
Variants

std::experimental::ranges:: Invocable, std::experimental::ranges:: RegularInvocable

From cppreference.net
template < class F, class ... Args >

concept bool Invocable =
requires ( F && f, Args && ... args ) {
ranges:: invoke ( std:: forward < F > ( f ) , std:: forward < Args > ( args ) ... ) ;
/* nicht erforderlich, gleichheitserhaltend zu sein */

} ;
(ranges TS)
template < class F, class ... Args >
concept bool RegularInvocable = Invocable < F, Args... > ;
(ranges TS)

Das Invocable -Konzept spezifiziert, dass ein aufrufbarer Typ F mit einer Menge von Argumenttypen Args... unter Verwendung der Funktionsvorlage ranges::invoke aufgerufen werden kann.

Das RegularInvocable -Konzept erweitert das Invocable -Konzept, indem es verlangt, dass der invoke -Ausdruck gleichheitserhaltend ist und weder das Funktionsobjekt noch die Argumente verändert.

Gleichheitserhaltung

Ein Ausdruck ist equality preserving , wenn er bei gleichen Eingaben gleiche Ausgaben liefert.

  • Die Eingaben eines Ausdrucks bestehen aus seinen Operanden.
  • Die Ausgaben eines Ausdrucks bestehen aus seinem Ergebnis und allen durch den Ausdruck modifizierten Operanden (falls vorhanden).

Jeder Ausdruck, der gleichungserhaltend sein muss, muss darüber hinaus stabil sein: Zwei Auswertungen eines solchen Ausdrucks mit denselben Eingabeobjekten müssen gleiche Ausgaben liefern, sofern keine explizite Änderung dieser Eingabeobjekte zwischen den Auswertungen erfolgt.

Sofern nicht anders angegeben, muss jeder Ausdruck, der in einem requires-expression verwendet wird, gleichheitserhaltend und stabil sein, und die Auswertung des Ausdrucks darf nur seine nicht-konstanten Operanden modifizieren. Operanden, die konstant sind, dürfen nicht modifiziert werden.

Hinweise

Der Unterschied zwischen Invocable und RegularInvocable ist rein semantisch.

Ein Zufallszahlengenerator kann Invocable erfüllen, aber nicht RegularInvocable ( komische ausgenommen ).