Namensräume
Varianten
Aktionen

std::generator

Von cppreference.com
< cpp‎ | coroutine
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
 
Coroutine support
Coroutine traits
Coroutine handle
No-op coroutines
Trivial awaitables
Range generators
generator
(C++23)
 
Bereichsbibliothek
Range-Adaptoren
 
 
Definiert in Header <generator>
template<

    class Ref,
    class V = void,
    class Allocator = void >
class generator

    : public ranges::view_interface<generator<Ref, V, Allocator>>
(1) (seit C++23)
namespace pmr {

    template< class Ref, class V = void >
    using generator =
        std::generator<Ref, V, std::pmr::polymorphic_allocator<>>;

}
(2) (seit C++23)
1) Die Klassenschablone std::generator stellt eine view der Elemente dar, die durch die Auswertung einer Coroutine ergeben werden.
2) Bequeme Alias-Schablone für die generator unter Verwendung des polymorphen Allocators.

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 std::generator mit einem Stack verbunden (behandelt wie durch ein Objekt vom Typ std::unique_ptr<std::stack<std::coroutine_handle<>>>).

  • Wenn begin aufgerufen wird, wird ein neuer Stack erstellt und der Generator zum Stack hinzugefügt.
  • Wenn eine co_yield ranges::elements_of(rng)-Anweisung im Generatorrumpf ausgewertet wird, wird rng in einen Generator konvertiert und zum Stack hinzugefügt, der den umschließenden Generator enthält.
  • Wenn ein Generator-Iterator inkrementiert wird, wird die Coroutine oben auf dem zugehörigen Stack fortgesetzt.
  • Wenn ein Generator beendet wird (d.h. wenn promise_type::final_suspend aufgerufen wird), wird er vom Stack entfernt.
    ((exposition-only member object*)
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) [edit]
zerstört effektiv den gesamten Stack von yield-generierten generators
(public member function) [edit]
weist ein generator-Objekt zu
(public member function) [edit]
setzt die initial suspendierte Coroutine fort und gibt einen Iterator zu ihrem Handle zurück
(public member function) [edit]
gibt std::default_sentinel zurück
(public member function) [edit]
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>) [edit]
(C++23)
gibt einen konstanten Iterator zum Anfang des Bereichs zurück
(public member function of std::ranges::view_interface<D>) [edit]
(C++23)
gibt ein Sentinel für den konstanten Iterator des Bereichs zurück
(public member function of std::ranges::view_interface<D>) [edit]
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]

[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

Erzeugt ein Coroutine-Handle, das beim Wiederaufnehmen oder Zerstören keine beobachtbaren Effekte hat
(Funktion) [bearbeiten]