std::generator
Definido en el archivo de encabezado <generator> | ||
template< class Ref, | (1) | (desde C++23) |
namespace pmr { template<class Ref, class V =void> | (2) | (desde C++23) |
std::generator
presenta una vista de los elementos producidos por la evaluación de una corrutina.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 rangorng 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.
Contenido |
[editar]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.
[editar]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.
|
El programa está mal formado si no se satisface cualquiera de estos requisitos.
[editar]Datos miembro
Miembro | Definición |
active_ (private) | Internamente, cada instancia activa de
|
coroutine_ (private) | Un identificador de tipo std::coroutine_handle<promise_type> (objeto miembro solo de exposición*) |
[editar]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 suspendida inicialmente y devuelve un iterador a su identificador. (función miembro pública) | |
Devuelve std::default_sentinel. (función miembro pública) | |
Heredadas de std::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> ) |
(C++20) | 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) |
[editar]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. |
[editar]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
[editar]Referencias
- El estándar C++23 (ISO/IEC 14882:2023):
- 26.8 Generadores de rangos [coro.generator]
[editar]Véase también
(C++20) | Crea un identificador de corrutina que no tiene efectos observables cuando se reanuda o destruye (función) |