Namespaces
Variants

std:: generator

From cppreference.net
Utilities library
Coroutine support
Coroutine traits
Coroutine handle
No-op coroutines
Trivial awaitables
Range generators
generator
(C++23)
Ranges library
Range adaptors
Определено в заголовочном файле <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)
1) Шаблон класса std::generator представляет view элементов, возвращаемых при выполнении корутины .
2) Удобный псевдоним-шаблон для generator с использованием polymorphic allocator .

std::generator генерирует последовательность элементов, многократно возобновляя выполнение сопрограммы, из которой он был возвращён. Каждый раз при вычислении оператора co_yield сопрограмма производит один элемент последовательности. Когда оператор co_yield имеет форму co_yield ranges :: elements_of ( rng ) , каждый элемент range 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  & >
Требования к типам
-
std:: allocator_traits < Allocator > :: pointer является типом указателя.
-
value является типом объекта без cv-квалификаторов.
-
reference является либо ссылочным типом, либо типом объекта без cv-квалификаторов, который моделирует copy_constructible .
-
Пусть RRef обозначает std:: remove_reference_t < reference  > && , если reference является ссылочным типом, и reference в противном случае.

Программа является некорректной, если любое из этих требований к типам не выполняется.

Члены данных

Член Определение
active_ (приватный)

Внутренне каждый активный экземпляр std::generator ассоциирован со стеком (обрабатывается как объект типа std:: unique_ptr < std:: stack < std:: coroutine_handle <>>> ).

  • Когда вызывается begin , создается новый стек и генератор добавляется в стек.
  • Когда в теле генератора вычисляется co_yield ranges :: elements_of ( rng ) , rng преобразуется в генератор и добавляется в стек, содержащий охватывающий генератор.
  • Когда итератор генератора инкрементируется , возобновляется корутина на вершине ассоциированного стека.
  • Когда генератор завершается (т.е. при вызове promise_type::final_suspend ), он удаляется из стека.
    ( объект-член только для демонстрации* )
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)
Наследуется от std::ranges::view_interface
возвращает, является ли производное представление пустым, предоставляется только если оно удовлетворяет sized_range или forward_range
(public member function of std::ranges::view_interface<D> )
(C++23)
возвращает константный итератор на начало диапазона
(public member function of std::ranges::view_interface<D> )
(C++23)
возвращает страж для константного итератора диапазона
(public member function of std::ranges::view_interface<D> )
возвращает, является ли производное представление непустым, предоставляется только если ranges::empty применимо к нему
(public member function of 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]

Смотрите также

создаёт обработчик сопрограммы, не имеющий наблюдаемых эффектов при возобновлении или уничтожении
(функция)