std::generator
| Definiert in Header <generator> |
||
| template< class Ref, |
(1) | (seit C++23) |
| namespace pmr { template< class Ref, class V = void > |
(2) | (seit C++23) |
std::generator stellt eine view der Elemente dar, die durch die Auswertung einer Coroutine ergeben werden.Ein std::generator erzeugt eine Sequenz von Elementen, indem die Coroutine, von der er zurückgegeben wurde, wiederholt fortgesetzt wird. Jedes Mal, wenn eine co_yield-Anweisung ausgewertet wird, produziert die Coroutine ein Element der Sequenz. Wenn die co_yield-Anweisung die Form co_yield ranges::elements_of(rng) hat, wird jedes Element des range rng nacheinander als Element der Sequenz produziert.
std::generator modelliert view und input_range.
Das Verhalten eines Programms, das eine Spezialisierung für std::generator hinzufügt, ist undefiniert.
Inhalt |
[edit] Template-Parameter
| Ref | - | der Referenztyp (ranges::range_reference_t) des Generators. Wenn V void ist, werden sowohl der Referenztyp als auch der Werttyp aus Ref abgeleitet. |
| V | - | der Werttyp (ranges::range_value_t) des Generators oder void |
| Allocator | - | ein Allocator-Typ oder void |
Wenn Allocator nicht void ist, ist das Verhalten undefiniert, wenn Allocator die Allocator-Anforderungen nicht erfüllt.
[edit] Member-Typen
| Mitglied | Definition |
value (private) |
std::conditional_t<std::is_void_v<V>, std::remove_cvref_t<Ref>, V>; ((nur zur Veranschaulichung)*) |
reference (private) |
std::conditional_t<std::is_void_v<V>, Ref&&, Ref>; ((nur zur Veranschaulichung)*) |
yielded |
std::conditional_t<std::is_reference_v<reference >, reference, const reference &>
|
| Typanforderungen | ||
| -std::allocator_traits<Allocator>::pointer ist ein Zeigertyp. | ||
-value ist ein cv-unqualifizierter Objekttyp. | ||
-reference ist entweder ein Referenztyp oder ein cv-unqualifizierter Objekttyp, der copy_constructible modelliert. | ||
-Sei RRef std::remove_reference_t<reference >&&, wenn reference ein Referenztyp ist, und andernfalls reference.
|
Das Programm ist fehlerhaft, wenn eine dieser Typanforderungen nicht erfüllt ist.
[edit] Datenmember
| Mitglied | Definition |
active_ (private) |
Intern ist jede aktive Instanz von
|
coroutine_ (private) |
ein Handle vom Typ std::coroutine_handle<promise_type> ((exposition-only member object*) |
[edit] Member-Funktionen
konstruiert ein generator-Objekt(public member function) | |
zerstört effektiv den gesamten Stack von yield-generierten generators(public member function) | |
weist ein generator-Objekt zu(public member function) | |
| setzt die initial suspendierte Coroutine fort und gibt einen Iterator zu ihrem Handle zurück (public member function) | |
| gibt std::default_sentinel zurück (public member function) | |
Geerbt von std::ranges::view_interface | |
gibt zurück, ob die abgeleitete Ansicht leer ist, bereitgestellt nur, wenn sie sized_range oder forward_range erfüllt(public member function of std::ranges::view_interface<D>) | |
| (C++23) |
gibt einen konstanten Iterator zum Anfang des Bereichs zurück (public member function of std::ranges::view_interface<D>) |
| (C++23) |
gibt ein Sentinel für den konstanten Iterator des Bereichs zurück (public member function of std::ranges::view_interface<D>) |
| gibt zurück, ob die abgeleitete Ansicht nicht leer ist, bereitgestellt nur, wenn ranges::empty darauf anwendbar ist (public member function of std::ranges::view_interface<D>) | |
[edit] Verschachtelte Klassen
| der Promise-Typ (public member class) | |
| der Iterator-Typ ((nur zur Veranschaulichung)*) |
[edit] Anmerkungen
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_generator |
202207L |
(C++23) | std::generator – synchrone Coroutine-Generator für Ranges |
[edit] Beispiel
#include <generator> #include <iostream> template<typename T> struct Tree { T value; Tree *left{}, *right{}; std::generator<const T&> traverse_inorder() const { if (left) co_yield std::ranges::elements_of(left->traverse_inorder()); co_yield value; if (right) co_yield std::ranges::elements_of(right->traverse_inorder()); } }; int main() { Tree<char> tree[] { {'D', tree + 1, tree + 2}, // │ // ┌───────────────┴────────────────┐ // │ │ {'B', tree + 3, tree + 4}, {'F', tree + 5, tree + 6}, // │ │ // ┌─────────┴─────────────┐ ┌───────────┴─────────────┐ // │ │ │ │ {'A'}, {'C'}, {'E'}, {'G'} }; for (char x : tree->traverse_inorder()) std::cout << x << ' '; std::cout << '\n'; }
Ausgabe
A B C D E F G
[edit] Referenzen
- C++23 Standard (ISO/IEC 14882:2024)
- 26.8 Range generators [coro.generator]
[edit] Siehe auch
| (C++20) |
Erzeugt ein Coroutine-Handle, das beim Wiederaufnehmen oder Zerstören keine beobachtbaren Effekte hat (Funktion) |