std::execution::read_env
| Definiert in Header <execution> |
||
| inline constexpr /*unspecified*/ read_env{}; |
(seit C++26) (Customization-Point-Objekt) |
|
| Aufruf-Signatur |
||
| execution::sender auto read_env( auto&& query ); |
(seit C++26) | |
Eine Sender-Factory, die einen Sender zurückgibt, der in die Umgebung eines Empfängers greift und den aktuellen Wert abruft, der mit einem gegebenen Query-Objekt verbunden ist.
Für jedes Query-Objekt q ist der Ausdruck read_env(q) ausdrucksäquivalent zu /*make-sender*/(read_env, q).
Customization Point Objects
Der Name execution::read_env bezeichnet ein Customization Point Object, welches ein konstantes Funktionsobjekt eines literalen semiregular Klassentyps ist. Zu Expositionszwecken wird die cv-unqualifizierte Version seines Typs als __read_env_fn bezeichnet.
Alle Instanzen von __read_env_fn sind gleich. Die Effekte des Aufrufs unterschiedlicher Instanzen des Typs __read_env_fn auf dieselben Argumente sind äquivalent, unabhängig davon, ob der den Instanz bezeichnende Ausdruck ein lvalue oder rvalue ist und ob er const-qualifiziert ist oder nicht (eine volatile-qualifizierte Instanz muss jedoch nicht aufrufbar sein). Somit kann execution::read_env frei kopiert werden und seine Kopien können austauschbar verwendet werden.
Gegeben sei eine Menge von Typen Args.... Wenn std::declval<Args>()... die obigen Anforderungen für Argumente an execution::read_env erfüllt, dann modelliert __read_env_fn
- std::invocable<__read_env_fn, Args...>,
- std::invocable<const __read_env_fn, Args...>,
- std::invocable<__read_env_fn&, Args...>, und
- std::invocable<const __read_env_fn&, Args...>.
Andernfalls nimmt kein Funktionsaufrufoperator von __read_env_fn an der Überladungsauflösung teil.
[edit] Beispiel
Ein Beispiel für die Verwendung dieser Factory ist die Planung abhängiger Arbeit auf dem Scheduler des Empfängers, der mit read_env(get_scheduler) erhalten werden kann.
std::execution::sender auto task = std::execution::read_env(std::execution::get_scheduler) | std::execution::let_value([](auto sched) { return std::execution::starts_on(sched, /*some nested work here*/); }); std::this_thread::sync_wait( std::move(task) ); // wait for it to finish