namespace std::execution {
template <class T = void, class Environment = env<>>
class task;
}
概要
taskクラステンプレートは、コルーチンの戻り値型として使用できるSenderを表す。
- 第1テンプレートパラメータ
Tがvoidではないとき、値完了のデータ型を定義する。そうでなければ、値完了はデータを持たない。task<T, E>を返すコルーチン内部では、(もしあれば)co_returnのオペランドはset_valueの引数となる。 - 第2テンプレートパラメータ
Environmentは、taskの動作カスタマイズに用いられる。
クラス仕様
taskクラステンプレートは、下記の説明専用メンバ変数を持つ。
handle:coroutine_handle<promise_type>
Tがvoid、参照型、cv修飾された非配列オブジェクト型のいずれかであり、かつEがクラス型であるとき、task<T, E>はsenderのモデルである。そうでなければ、task<T, E>の定義をインスタンス化するプログラムは不適格となる。
taskテンプレート特殊化のネストした型は、Environmentパラメータに基づいて決定される :
allocator_type:Environment::allocator_typeが有効な型ならばその型、そうでなければallocator<byte>scheduler_type:Environment::scheduler_typeが有効な型ならばその型、そうでなければtask_schedulerstop_source_type:Environment::stop_source_typeが有効な型ならばその型、そうでなければinplace_stop_sourcestop_token_type:decltype(declval<stop_source_type>().get_token())error_types:Environment::error_typesが有効な型ならばその型、そうでなければcompletion_signatures<set_error_t(exception_ptr)>
error_typesがcompletion_signatures<ErrorSigs...>の特殊化ではない、もしくはErrorSigsがset_error_t(E)が適格でない要素型Eを含むとき、プログラムは不適格となる。
型エイリアスcompletion_signaturesは、(未規定の順序で)次のテンプレート実引数をもつexecution::completion_signaturesの特殊化となる :
Tがvoidのときset_value_t()、そうでなければset_value_t(T)error_typesで表されるexecution::completion_signaturesの特殊化のテンプレート実引数(エラー型Errを持つset_error_t(Err))set_stopped_t()
メンバ関数
| 名前 | 説明 | 対応バージョン |
|---|---|---|
(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
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??