std::generator
cppreference.net에서
| 헤더 <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는 코루틴이 반환된 코루틴을 반복적으로 재개함으로써 요소의 시퀀스를 생성합니다.
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
&
>
|
| 유형 요구사항 | ||
|
-
|
||
-
value
는 cv-unqualified 객체 유형입니다.
|
||
-
reference
는 참조 유형이거나,
copy_constructible
을 모델링하는 cv-unqualified 객체 유형입니다.
|
||
-
RRef
가 다음을 나타낸다고 가정합니다:
std::
remove_reference_t
<
reference
>
&&
, 만약
reference
가 참조 유형인 경우, 그렇지 않으면
reference
입니다.
|
이러한 타입 요구 사항 중 하나라도 충족되지 않으면 프로그램은 형식 오류입니다.
데이터 멤버
| 멤버 | 설명 |
active_ (비공개)
|
내부적으로,
|
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]
참고 항목
|
(C++20)
|
재개되거나 파괴될 때 관찰 가능한 효과가 없는 코루틴 핸들을 생성합니다
(함수) |