std:: generator
Defined in header
<generator>
|
||
template
<
class
Ref,
|
(1) | (since C++23) |
namespace
pmr
{
template
<
class
Ref,
class
V
=
void
>
|
(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.
Template parameters
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 ( ranges::range_value_t ) of the generator, or void |
Allocator | - | an allocator type or void |
If
Allocator
is not
void
, then the behavior is undefined if
Allocator
does not meet the
Allocator
requirements.
Member types
Member | Definition |
value
(private)
|
std::
conditional_t
<
std::
is_void_v
<
V
>
,
std::
remove_cvref_t
<
Ref
>
, V
>
;
( exposition-only member type* ) |
reference
(private)
|
std::
conditional_t
<
std::
is_void_v
<
V
>
, Ref
&&
, Ref
>
;
( exposition-only member type* ) |
yielded
|
std::
conditional_t
<
std::
is_reference_v
<
reference
>
,
reference
,
const
reference
&
>
|
Type requirements | ||
-
|
||
-
value
is a cv-unqualified object type.
|
||
-
reference
is either a reference type, or a cv-unqualified object type that models
copy_constructible
.
|
||
-
RRef
denote
std::
remove_reference_t
<
reference
>
&&
, if
reference
is a reference type, and
reference
otherwise.
|
The program is ill-formed if any of these type requirements is not satisfied.
Data members
Member | Definition |
active_
(private)
|
Internally, each active instance of
|
coroutine_
(private)
|
a handle of type
std::
coroutine_handle
<
promise_type
>
( exposition-only member object* ) |
Member functions
constructs a
generator
object
(public member function) |
|
effectively destroys the entire stack of yielded
generator
s
(public member function) |
|
assigns a
generator
object
(public member function) |
|
resumes the initially suspended coroutine and returns an iterator to its handle
(public member function) |
|
returns
std::default_sentinel
(public member function) |
|
Inherited from std::ranges::view_interface |
|
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>
)
|
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>
)
|
Nested classes
the promise type
(public member class) |
|
the iterator type
( exposition-only member class* ) |
Notes
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_generator
|
202207L | (C++23) |
std::generator
– synchronous
coroutine
generator for
ranges
|
Example
#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'; }
Output:
A B C D E F G
References
- C++23 standard (ISO/IEC 14882:2024):
-
- 26.8 Range generators [coro.generator]
See also
(C++20)
|
creates a coroutine handle that has no observable effects when resumed or destroyed
(function) |