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

履歴 編集

class template
<execution>

std::execution::task(C++26)

namespace std::execution {
  template <class T = void, class Environment = env<>>
  class task;
}

概要

taskクラステンプレートは、コルーチン戻り値型として使用できるSenderを表す。

  • 第1テンプレートパラメータTvoidではないとき、値完了のデータ型を定義する。そうでなければ、値完了はデータを持たない。task<T, E>を返すコルーチン内部では、(もしあれば)co_returnのオペランドはset_valueの引数となる。
  • 第2テンプレートパラメータEnvironmentは、taskの動作カスタマイズに用いられる。

クラス仕様

taskクラステンプレートは、下記の説明専用メンバ変数を持つ。

Tvoid、参照型、cv修飾された非配列オブジェクト型のいずれかであり、かつEがクラス型であるとき、task<T, E>senderのモデルである。そうでなければ、task<T, E>の定義をインスタンス化するプログラムは不適格となる。

taskテンプレート特殊化のネストした型は、Environmentパラメータに基づいて決定される :

  • allocator_type : Environment::allocator_typeが有効な型ならばその型、そうでなければallocator<byte>
  • scheduler_type : Environment::scheduler_typeが有効な型ならばその型、そうでなければtask_scheduler
  • stop_source_type : Environment::stop_source_typeが有効な型ならばその型、そうでなければinplace_stop_source
  • stop_token_type : decltype(declval<stop_source_type>().get_token())
  • error_types : Environment::error_typesが有効な型ならばその型、そうでなければcompletion_signatures<set_error_t(exception_ptr)>

error_typescompletion_signatures<ErrorSigs...>の特殊化ではない、もしくはErrorSigsset_error_t(E)適格でない要素型Eを含むとき、プログラムは不適格となる。

型エイリアスcompletion_signaturesは、(未規定の順序で)次のテンプレート実引数をもつexecution::completion_signaturesの特殊化となる :

メンバ関数

名前 説明 対応バージョン
(constructor) コンストラクタ C++26
(destructor) デストラクタ C++26
connect Receiverとの接続操作 C++26

メンバ型

名前 説明 対応バージョン
sender_concept sender_t C++26
completion_signatures 完了シグネチャ集合 C++26
allocator_type コルーチンのアロケータ型 C++26
scheduler_type コルーチンのScheduler型 C++26
stop_source_type コルーチンの停止ソース型 C++26
stop_token_type コルーチンの停止トークン型 C++26
error_types コルーチンのエラー完了の結果型 C++26
state タスクコルーチン動作の説明専用クラステンプレート C++26
promise_type タスクコルーチンのPromise型 C++26

#include <cassert>
#include <execution>
namespace ex = std::execution;

// int型を返すタスクコルーチンを定義
ex::task<int> work(int n)
{
  // 他Senderの結果値を取得する
  int m = co_await ex::just(3);
  // タスクコルーチンから値を返す
  co_return m * n * 7;
}

int main()
{
  // タスクコルーチン呼び出しによりSenderを生成
  ex::sender auto sndr = work(2);

  // Sender(タスクコルーチン)を開始して結果取得
  auto [n] = std::this_thread::sync_wait(std::move(sndr)).value();
  assert(n == 42);
}

出力

バージョン

言語

  • C++26

処理系

関連項目

参照