Namespaces
Variants

std::generator

De es.cppreference.net
 
 
Biblioteca de utilidades
Soporte del lenguaje
Soporte de tipos (tipos básicos, RTTI)
Macros de prueba de características de la biblioteca (C++20)
Utilidades de programa
Funciones variádicas
Soporte de corrutinas (C++20)
Soporte de contratos (C++26)
Comparación de tres vías
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilidades generales
Operadores relacionales (obsoleto en C++20)
 
Soporte de corrutinas
Rasgos de corrutinas
Manejo de corrutinas
Corrutinas sin operación
Esperables triviales
Generadores de rango
(C++23)
 
Biblioteca de rangos
Adaptadores de rango
 
 
Definido en el encabezado <generator>
template<
    class Ref,
    class V = void,
    class Allocator = void >
class generator
    : public ranges::view_interface<generator<Ref, V, Allocator>>
(1) (desde C++23)
namespace pmr {
    template< class Ref, class V = void >
    using generator =
        std::generator<Ref, V, std::pmr::polymorphic_allocator<>>;
}
(2) (desde C++23)
1) La plantilla de clase std::generator presenta una vista de los elementos producidos por la evaluación de una corrutina.
2) Alias de plantilla de conveniencia para generator que utiliza el asignador polimórfico.

Un std::generator genera una secuencia de elementos reanudando repetidamente la corrutina de la que fue devuelto. Cada vez que se evalúa una sentencia co_yield, la corrutina produce un elemento de la secuencia. Cuando la sentencia co_yield es de la forma co_yield ranges::elements_of(rng), cada elemento del rango rng se produce sucesivamente como un elemento de la secuencia.

std::generator modela vista y rango_de_entrada.

El comportamiento de un programa que añade una especialización para std::generator no está definido.

Parámetros de plantilla

Ref - el tipo de referencia ( ranges::range_reference_t ) del generador. Si V es void , tanto el tipo de referencia como el tipo de valor se infieren de Ref
V - el tipo de valor ( ranges::range_value_t ) del generador, o void
Allocator - un tipo de asignador o void

Si Allocator no es void , entonces el comportamiento es indefinido si Allocator no cumple con los requisitos de Allocator .

Tipos de miembros

Miembro Definición
value (privado) std:: conditional_t < std:: is_void_v < V > , std:: remove_cvref_t < Ref > , V > ;
( tipo de miembro solo para exposición* )
reference (privado) std:: conditional_t < std:: is_void_v < V > , Ref && , Ref > ;
( tipo de miembro solo para exposición* )
yielded std:: conditional_t < std:: is_reference_v < reference  > , reference , const reference  & >
Requisitos de tipo
-
std:: allocator_traits < Allocator > :: pointer es un tipo puntero.
-
value es un tipo objeto sin calificadores cv.
-
reference es un tipo referencia, o un tipo objeto sin calificadores cv que modela copy_constructible .
-
Sea RRef que denota std:: remove_reference_t < reference  > && , si reference es un tipo referencia, y reference en caso contrario.

El programa está mal formado si no se satisface alguno de estos requisitos de tipo.

Miembros de datos

Miembro Descripción
active_ (privado)

Internamente, cada instancia activa de std::generator está asociada con una pila (manejada como si fuera por un objeto de tipo std::unique_ptr<std::stack<std::coroutine_handle<>>>).

  • Cuando begin es llamado, se crea una nueva pila y el generador se agrega a la pila.
  • Cuando co_yield ranges::elements_of(rng) es evaluado en un cuerpo de generador, rng se convierte en un generador y se agrega a la pila que contiene el generador envolvente.
  • Cuando un iterador generador es incrementado, la corrutina en la parte superior de la pila asociada se reanuda.
  • Cuando un generador termina (es decir, cuando promise_type::final_suspend es llamado), se elimina de la pila.
    (objeto miembro de solo exposición*)
coroutine_ (privado) un identificador (handle) de tipo std::coroutine_handle<promise_type>
(objeto miembro de solo exposición*)

Funciones miembro

construye un objeto generator
(función miembro pública)
destruye efectivamente toda la pila de generator s producidos
(función miembro pública)
asigna un objeto generator
(función miembro pública)
reanuda la corrutina inicialmente suspendida y devuelve un iterador a su manejador
(función miembro pública)
devuelve std::default_sentinel
(función miembro pública)
Heredado de ranges::view_interface
devuelve si la vista derivada está vacía, proporcionado únicamente si satisface sized_range o forward_range
(función miembro pública de std::ranges::view_interface<D>)
(C++23)
devuelve un iterador constante al inicio del rango
(función miembro pública de std::ranges::view_interface<D>)
(C++23)
devuelve un centinela para el iterador constante del rango
(función miembro pública de std::ranges::view_interface<D>)
devuelve si la vista derivada no está vacía, proporcionado únicamente si ranges::empty es aplicable a ella
(función miembro pública de std::ranges::view_interface<D>)

Clases anidadas

el tipo promise
(clase miembro pública)
el tipo iterador
( clase miembro solo para exposición* )

Notas

Macro de prueba de características Valor Std Característica
__cpp_lib_generator 202207L (C++23) std::generator – generador síncrono de corrutinas para rangos

Ejemplo

#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';
}

Salida:

A B C D E F G

Referencias

  • Estándar C++23 (ISO/IEC 14882:2024):
  • 26.8 Generadores de rango [coro.generator]

Véase también

crea un manejador de corrutina que no tiene efectos observables cuando se reanuda o se destruye
(función)