std::generator
| Определён в заголовочном файле <generator>
|
||
template<
class Ref,
class V = void,
class Allocator = void >
class generator
: public ranges::view_interface<generator<Ref, V, Allocator>>
|
(1) | (начиная с C++23) |
namespace pmr {
template< class Ref, class V = void >
using generator =
std::generator<Ref, V, std::pmr::polymorphic_allocator<>>;
}
|
(2) | (начиная с C++23) |
std::generator представляет собой представление элементов, полученных в результате вычисления корутины.Объект std::generator генерирует последовательность элементов, многократно возобновляя корутину, из которой он был возвращён.
Каждый раз, когда вычисляется выражение co_yield, корутина производит один элемент последовательности.
Когда выражение co_yield имеет форму co_yield ranges::elements_of(rng), каждый элемент диапазона rng последовательно производится как элемент последовательности.
std::generator удовлетворяет концепциям view и input_range.
Поведение программы, добавляющей специализацию для std::generator, не определено.
Параметры шаблона
| Ref | - |
ссылочный тип (
ranges::range_reference_t
) генератора. Если
V
является
void
, то и ссылочный тип, и тип значения выводятся из
Ref
|
| V | - | тип значения ( ranges::range_value_t ) генератора, или void |
| Allocator | - | тип аллокатора или void |
Если
Allocator
не является
void
, то поведение не определено, если
Allocator
не удовлетворяет требованиям
Allocator
.
Типы членов
| Член | Определение |
value
(приватный)
|
std::
conditional_t
<
std::
is_void_v
<
V
>
,
std::
remove_cvref_t
<
Ref
>
, V
>
;
( тип члена только для демонстрации* ) |
reference
(приватный)
|
std::
conditional_t
<
std::
is_void_v
<
V
>
, Ref
&&
, Ref
>
;
( тип члена только для демонстрации* ) |
yielded
|
std::
conditional_t
<
std::
is_reference_v
<
reference
>
,
reference
,
const
reference
&
>
|
| Требования к типам | ||
|
-
|
||
-
value
является типом объекта без cv-квалификаторов.
|
||
-
reference
является либо ссылочным типом, либо типом объекта без cv-квалификаторов, который моделирует
copy_constructible
.
|
||
-
RRef
обозначает
std::
remove_reference_t
<
reference
>
&&
, если
reference
является ссылочным типом, и
reference
в противном случае.
|
Программа является некорректной, если любое из этих требований к типам не выполняется.
Элементы данных
| Элемент | Описание |
active_ (закрытый)
|
Внутренне каждый активный экземпляр
|
coroutine_ (закрытый)
|
дескриптор типа std::coroutine_handle<promise_type>(пояснительный член-объект*) |
Функции-члены
создает объект
generator
(public member function) |
|
эффективно уничтожает весь стек возвращенных
generator
s
(public member function) |
|
присваивает объект
generator
(public member function) |
|
|
возобновляет первоначально приостановленную сопрограмму и возвращает итератор к ее обработчику
(public member function) |
|
|
возвращает
std::default_sentinel
(public member function) |
|
Унаследовано от ranges::view_interface | |
| возвращает, является ли производное представление пустым, при условии что оно удовлетворяет sized_range или forward_range (публичная функция-член std::ranges::view_interface<D>)
| |
(C++23) |
возвращает константный итератор на начало диапазона (публичная функция-член std::ranges::view_interface<D>)
|
(C++23) |
возвращает сторож для константного итератора диапазона (публичная функция-член std::ranges::view_interface<D>)
|
| возвращает, является ли производное представление непустым, при условии что ranges::empty применимо к нему (публичная функция-член std::ranges::view_interface<D>)
| |
Вложенные классы
|
тип promise
(публичный класс-член) |
|
|
тип итератора
( класс-член только для демонстрации* ) |
Примечания
| Макрос тестирования возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_generator
|
202207L
|
(C++23) |
std::generator
– синхронный
сопрограммный
генератор для
диапазонов
|
Пример
#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'; }
Вывод:
A B C D E F G
Ссылки
- Стандарт C++23 (ISO/IEC 14882:2024):
-
- 26.8 Генераторы диапазонов [coro.generator]
Смотрите также
|
(C++20)
|
создаёт обработчик сопрограммы, не имеющий наблюдаемых эффектов при возобновлении или уничтожении
(функция) |