• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    class template
    <coroutine>

    std::coroutine_traits

    namespace std {
      template<class R, class... ArgTypes>
      struct coroutine_traits;
    }
    

    概要

    コルーチンのPromise型を指定するためのトレイト。

    • ArgTypesが型のパラメータパックかつ非修飾のR::promise_typeが有効な型を表すとき、coroutine_traits<R,ArgTypes...>は下記の公開アクセスメンバを持つ。

    using promise_type = typename R::promise_type;
    

    • それ以外では、coroutine_traits<R,ArgTypes...>はメンバを持たない。

    このクラステンプレートをプログラム定義型で特殊化する場合、promise_typeは公開アクセスのネスト型とする必要がある。

    メンバ型

    名前 説明 対応バージョン
    promise_type コルーチンのPromise型 C++20

    #include <coroutine>
    #include <iostream>
    #include <utility>
    
    struct task;
    
    struct task_promise {
      task get_return_object();
      auto initial_suspend() { return std::suspend_never{}; }
      auto final_suspend() noexcept { return std::suspend_always{}; }
      auto yield_value(int) { return std::suspend_always{}; }
      void return_void() {}
      void unhandled_exception() { std::terminate(); }
    };
    
    struct task {
      using coro_handle = std::coroutine_handle<task_promise>;
      explicit task(task_promise& p)
        : coro_(coro_handle::from_promise(p)) {}
      task(task const&) = delete;
      task(task&& rhs)
        : coro_(std::exchange(rhs.coro_, nullptr)) {}
      ~task()
      {
        if (coro_)
          coro_.destroy();
      }
    
      void next()
      {
        if (!coro_.done())
          coro_.resume();
      }
    
    private:
      coro_handle coro_;
    };
    
    task task_promise::get_return_object()
    {
      return task{*this};
    }
    
    // 戻り値taskの関数をコルーチンにアダプトする
    template <typename... ArgTypes>
    struct std::coroutine_traits<task, ArgTypes...> {
      using promise_type = task_promise;
    };
    
    task coro()
    {
      std::cout << "coro#1" << std::endl;
      co_yield {};
      std::cout << "coro#2" << std::endl;
    }
    
    int main()
    {
      auto t = coro();
      std::cout << "main#1" << std::endl;
      t.next();
      std::cout << "main#2" << std::endl;
    }
    

    出力

    coro#1
    main#1
    coro#2
    main#2
    

    バージョン

    言語

    • C++20

    処理系

    関連項目