std::coroutine_traits
std::coroutine_traits (코루틴 타입 특성)
코루틴 함수의 반환 타입을 기반으로 그 코루틴의 promise 타입을 결정하는 특성 클래스 템플릿이에요. 컴파일러가 코루틴 함수를 컴파일할 때 promise 타입을 찾는 데 사용해요. C++20부터 있어요.
출처: cppreference
본문
<coroutine> 헤더에 정의돼 있고, 코루틴 특성 클래스 템플릿이에요.
template< class R, class... Args >
struct coroutine_traits;
std::coroutine_traits<R, Args...>는 코루틴 함수의 반환 타입 R(그리고 인자 타입들 Args...)을 기반으로 코루틴의 promise 타입을 결정해요. 기본 템플릿은 R 타입에 promise_type이라는 중첩 타입이 있기를 요구해요.
// 기본 템플릿 (개념적으로)
template< class R, class... Args >
struct coroutine_traits
{
using promise_type = typename R::promise_type;
};
즉 코루틴 함수의 반환 타입(예: task, generator 등)은 반드시 promise_type 중첩 타입을 정의해야 해요. 컴파일러는 코루틴 함수의 시그니처에 맞춰 coroutine_traits<R, ArgTypes...>를 인스턴스화하고, 거기서 얻은 promise_type으로 코루틴 프레임을 구성해요.
사용자는 이 특성을 전문 특수화(specialize)해서, 반환 타입의 promise_type을 쓰지 않고도 자신의 promise 타입을 지정할 수 있어요. 예를 들어 특정 반환 타입에 대해 coroutine_traits를 특수화하면 라이브러리가 내부 반환 타입과 다른 promise를 연결할 수 있어요.
Args...는 코루틴 함수의 매개변수 타입들로, promise 선택에 인자 타입 정보가 필요할 때 특수화에서 활용할 수 있어요.
이 특성은 대부분의 코루틴 라이브러리가 반환 타입에 promise_type을 정의하는 표준 관례의 기반이에요.