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) polymorphic allocator 를 사용하는 generator 의 편의용 별칭 템플릿입니다.

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 (private) std:: conditional_t < std:: is_void_v < V > , std:: remove_cvref_t < Ref > , V > ;
( 설명 전용 멤버 타입* )
reference (private) 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-unqualified 객체 유형입니다.
-
reference 는 참조 유형이거나, copy_constructible 을 모델링하는 cv-unqualified 객체 유형입니다.
-
RRef 가 다음을 나타낸다고 가정합니다: std:: remove_reference_t < reference  > && , 만약 reference 가 참조 유형인 경우, 그렇지 않으면 reference 입니다.

이러한 타입 요구 사항 중 하나라도 충족되지 않으면 프로그램은 형식 오류입니다.

데이터 멤버

멤버 정의
active_ (private)

내부적으로, 각 활성 std::generator 인스턴스는 스택과 연관됩니다 ( std:: unique_ptr < std:: stack < std:: coroutine_handle <>>> 타입의 객체로 처리됨).

  • begin 가 호출되면 새로운 스택이 생성되고 제너레이터가 스택에 추가됩니다.
  • 제너레이터 본문에서 co_yield ranges :: elements_of ( rng ) 가 평가되면, rng 가 제너레이터로 변환되어 해당 제너레이터를 포함하는 스택에 추가됩니다.
  • 제너레이터 반복자가 증가될 때, 연관된 스택의 최상위 코루틴이 재개됩니다.
  • 제너레이터가 완료되면 (즉, promise_type::final_suspend 가 호출될 때), 스택에서 제거됩니다.
    ( 설명 전용 멤버 객체* )
coroutine_ (private) std:: coroutine_handle < promise_type > 타입의 핸들
( 설명 전용 멤버 객체* )

멤버 함수

generator 객체를 생성합니다
(public member function)
yield된 모든 generator 들의 전체 스택을 효과적으로 파괴합니다
(public member function)
generator 객체를 할당합니다
(public member function)
최초에 일시 중단된 코루틴을 재개하고 해당 핸들에 대한 반복자를 반환합니다
(public member function)
std::default_sentinel 을 반환합니다
(public member function)
std::ranges::view_interface 로부터 상속됨
파생된 뷰가 비어 있는지 여부를 반환합니다. sized_range 또는 forward_range 를 만족하는 경우에만 제공됩니다
( std::ranges::view_interface<D> 의 public member function)
(C++23)
범위의 시작을 가리키는 상수 반복자를 반환합니다
( std::ranges::view_interface<D> 의 public member function)
(C++23)
범위의 상수 반복자에 대한 sentinel을 반환합니다
( std::ranges::view_interface<D> 의 public member function)
파생된 뷰가 비어 있지 않은지 여부를 반환합니다. ranges::empty 가 적용 가능한 경우에만 제공됩니다
( std::ranges::view_interface<D> 의 public member function)

중첩 클래스

promise 타입
(public member class)
iterator 타입
( 설명 전용 멤버 클래스* )

참고 사항

기능 테스트 매크로 표준 기능
__cpp_lib_generator 202207L (C++23) std::generator – 동기식 코루틴 생성기 for 범위

예제

#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]

참고 항목

재개되거나 파괴될 때 관찰 가능한 효과가 없는 코루틴 핸들을 생성합니다
(함수)