Espacios de nombres
Variantes

std::generator

De cppreference.com
 
 
Biblioteca de servicios
 
Apoyo de corrutinas
Rasgos de corrutinas
Identificador de corrutina
Corrutinas no operativas
En espera triviales
 
Biblioteca de rangos
Adaptadores de rangos
 
 
<tbody> </tbody>
Definido en el archivo de 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 conveniente para que el generator use polymorphic allocator.

Un std::generator genera una secuencia de elementos reanudando repetidamente la corrutina desde la que fue devuelto. Cada vez que se evalúa una instrucción co_yield, la corrutina produce un elemento de la secuencia. Cuando la instrucción co_yield tiene 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 view e input_range.

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

Parámetros de plantilla

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

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

Tipos miembro

Miembro Definición
value (private) std::conditional_t<std::is_void_v<V>, std::remove_cvref_t<[[:Plantilla:void]]Ref>, V>;
(tipo miembro solo de exposición*)
reference (private) std::conditional_t<std::is_void_v<V>, Ref&&, Ref>;
(tipo miembro solo de 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 no calificado const volatile.
-
reference es ya sea un tipo referencia o un tipo objeto no calificado const volatile que modela copy_constructible.
-
Sea que RRef denote std::remove_reference_t<reference >&&, si reference es un tipo referencia, y reference de lo contrario.
  • Se modela std::common_reference_with<reference &&, value &>.
  • Se modela std::common_reference_with<reference &&, RRef &&>.
  • Se modela std::common_reference_with<RRef &&, const value &>.

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

Datos miembro

Miembro Definición
active_ (private)

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

  • Cuando se llama a begin, se crea una nueva pila y el generador se añade a la pila.
  • Cuando se evalúa a co_yield ranges::elements_of(rng) en el cuerpo de un generador, rng se convierte a un generador y se añade a la pila que contiene el generador circundante.
  • Cuando un iterador de generador se incrementa, se reanuda la corrutina en la parte superior de la pila asociada.
  • Cuando un generador termina (p. ej., cuando se llama a promise_type::final_suspend), se elimina de la pila.
    (objeto miembro solo de exposición*)
coroutine_ (private) Un identificador de tipo std::coroutine_handle<promise_type>
(objeto miembro solo de exposición*)

Funciones miembro

Construye un objeto generator.
(función miembro pública) [editar]
Destruye efectivamente toda la pila de generators producidos.
(función miembro pública) [editar]
Asigna un objeto generator.
(función miembro pública) [editar]
Reanuda la corrutina suspendida inicialmente y devuelve un iterador a su identificador.
(función miembro pública) [editar]
Devuelve std::default_sentinel.
(función miembro pública) [editar]
Heredadas de ranges::view_interface
(C++20)
Devuelve si la vista derivada está vacía o no. Se proporciona si la vista derivada satisface forward_range.
(función miembro pública de std::ranges::view_interface<D>) [editar]
Devuelve si la vista derivada está vacía o no. Se proporciona si ranges::empty le es aplicable.
(función miembro pública de std::ranges::view_interface<D>) [editar]

Clases anidadas

El tipo promesa.
(clase miembro pública)
El tipo iterador.
(clase miembro de solo exposición)

Notas

Macro de Prueba de característica Valor Estándar Comentario
__cpp_lib_generator 202207L (C++23) std::generator – Generador de corrutina síncrono 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

  • El estándar C++23 (ISO/IEC 14882:2023):
  • 26.8 Generadores de rangos [coro.generator]

Véase también

Crea un identificador de corrutina que no tiene efectos observables cuando se reanuda o destruye
(función) [editar]