Defined in header <generator> | ||
|---|---|---|
template<
class Ref,
class V = void,
class Allocator = void
> class generator : public ranges::view_interface<generator<Ref, V, Allocator>>
| (1) | (since C++23) |
namespace pmr {
template< class Ref, class V = void >
using generator =
std::generator<Ref, V, std::pmr::polymorphic_allocator<>>;
}
| (2) | (since C++23) |
std::generator presents a view of the elements yielded by the evaluation of a coroutine.A std::generator generates a sequence of elements by repeatedly resuming the coroutine from which it was returned. Each time a co_yield statement is evaluated, the coroutine produces one element of the sequence. When the co_yield statement is of the form co_yield ranges::elements_of(rng), each element of the range rng is successively produced as an element of the sequence.
std::generator models view and input_range.
The behavior of a program that adds a specialization for std::generator is undefined.
Internally, each active instance of std::generator is associated with a stack.
begin is called, a new stack is created and the generator is added to the stack. co_yield ranges::elements_of(rng) is evaluated in a generator body, rng is converted to a generator and added to the stack that contains the enclosing generator. final_suspend is called), it is removed from the stack. | Ref | - | the reference type (ranges::range_reference_t) of the generator. If V is void, both the reference type and the value type are inferred from Ref |
| V | - | the value type (range_value_t) of the generator, or void |
| Allocator | - | an allocator type or void |
If Allocator is not void, then:
std::allocator_traits<Allocator>::pointer is a pointer type; Allocator meets the Allocator requirements. | Member type | Definition |
|---|---|
yielded (since C++23) | std::conditional_t<std::is_reference_v<T>, T, const T&> |
/*value*/ [private] (since C++23) | std::conditional_t<std::is_void_v<V>, std::remove_cvref_t<Ref>, V>;./*value*/ is a cv-unqualified object type. The name is for exposition only. |
/*reference*/ [private] (since C++23) | std::conditional_t<std::is_void_v<V>, Ref&&, Ref>;./*reference*/ is either a reference type, or a cv-unqualified object type that models copy_constructible. The name is for exposition only. |
Let /*RRef*/ denote:
std::remove_reference_t</*reference*/>&&, if /*reference*/ is a reference type, and /*reference*/ otherwise. The following concepts are modeled:
std::common_reference_with</*reference*/&&, /*value*/&>, std::common_reference_with</*reference*/&&, /*RRef*/&&>, and std::common_reference_with</*RRef*/&&, const /*value*/&>. |
(C++23) | constructs a generator object (public member function) |
|
(C++23) | effectively destroys the entire stack of yielded generators (public member function) |
|
(C++23) | assigns a generator object (public member function) |
|
(C++23) | resumes the initially suspended coroutine and returns an iterator to its handle (public member function) |
|
(C++23) | returns std::default_sentinel (public member function) |
Inherited from |
|
|
(C++20) | returns whether the derived view is empty. Provided if it satisfies sized_range or forward_range. (public member function of std::ranges::view_interface<D>) |
|
(C++23) | returns a constant iterator to the beginning of the range. (public member function of std::ranges::view_interface<D>) |
|
(C++23) | returns a sentinel for the constant iterator of the range. (public member function of std::ranges::view_interface<D>) |
|
(C++20) | returns whether the derived view is not empty. Provided if ranges::empty is applicable to it. (public member function of std::ranges::view_interface<D>) |
|
(C++23) | the promise type (public member class) |
|
(C++23) | the iterator type (exposition-only member class) |
| Feature-test macro | Value | Std | Comment |
|---|---|---|---|
__cpp_lib_generator | 202207L | (C++23) |
std::generator – synchronous coroutine generator for ranges |
#include <generator>
#include <ranges>
#include <iostream>
std::generator<char> letters(char first)
{
for (;; co_yield first++);
}
int main()
{
for (const char ch : letters('a') | std::views::take(26))
std::cout << ch << ' ';
std::cout << '\n';
}Output:
a b c d e f g h i j k l m n o p q r s t u v w x y z
|
(C++20) | creates a coroutine handle that has no observable effects when resumed or destroyed (function) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/coroutine/generator