Namespaces
Variants

std::generator

cppreference.net에서
 
 
유틸리티 라이브러리
일반 유틸리티
관계 연산자 (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)



 
코루틴 지원
코루틴 특성
코루틴 핸들
무-연산 코루틴
단순 awaitable
범위 제너레이터
(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는 뷰와 입력 범위를 모델링합니다.

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_ (비공개)

내부적으로, 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)
yield된 모든 generator 들의 전체 스택을 효과적으로 파괴합니다
(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 타입
(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]

참고 항목

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