Namespaces
Variants

std::generator

От ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования возможностей библиотеки (C++20)
Утилиты программы
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Операторы отношений (устарело в C++20)
Функции сравнения целых чисел
(C++20)(C++20)(C++20)    
(C++20)
Обмен и операции с типами
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Типы общеупотребительной лексики
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
Поддержка корутин
Характеристики корутин
Дескриптор корутины
Пустые корутины
Тривиальные ожидания
Генераторы диапазонов
(C++23)
 
Библиотека диапазонов
Адаптеры диапазонов
 
 
Определён в заголовочном файле <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 представляет собой представление элементов, полученных в результате вычисления корутины.
2) Псевдоним шаблона для удобства, использующий 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  & >
Требования к типам
-
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)
Унаследовано от 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]

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

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