namespace std::execution {
template<class Tag, class Data, class... Child>
struct basic-sender : product-type<Tag, Data, Child...> { // exposition only
using sender_concept = sender_t;
using indices-for = index_sequence_for<Child...>; // exposition only
decltype(auto) get_env() const noexcept {
auto& [_, data, ...child] = *this;
return impls-for<Tag>::get-attrs(data, child...);
}
template<decays-to<basic-sender> Self, receiver Rcvr>
auto connect(this Self&& self, Rcvr rcvr) noexcept(see below)
-> basic-operation<Self, Rcvr> {
return {std::forward<Self>(self), std::move(rcvr)};
}
template<decays-to<basic-sender> Self, class... Env>
static constexpr auto get_completion_signatures();
};
}
概要
basic-senderは、Senderアルゴリズム動作仕様定義で用いられる説明専用のクラステンプレートである。
basic-sender<Tag, Data, Child...>はsenderのモデルであり、Senderアルゴリズム構築の結果型として利用される。
Tag: Senderアルゴリズムタグ(例:just,then)Data: Senderアルゴリズムに指定された追加の引数。複数個の引数はproduct-type型を用いて単一値として保持する。Child: 子Senderのリスト。Senderファクトリでは0個、Senderアダプタでは通常1個の子Senderを保持する。
クラス仕様
basic-senderの特殊化が集成体となるか否かは未規定である。
basic-sender型の式は構造化束縛における初期化子として利用できる。
basic-sender::connectメンバ関数noexcept節の式は下記の通り。
is_nothrow_constructible_v<basic-operation<Self, Rcvr>, Self, Rcvr>
get_completion_signaturesメンバ関数
template<class Tag, class Data, class... Child>
template<class Sndr, class... Env>
constexpr auto basic-sender<Tag, Data, Child...>::get_completion_signatures();
型EをリストEnv..., env<>における先頭の型としたとき、環境EをもつReceiver型をRcvrとする。式CHECK-TYPE()をimpls-for<Tag>::template check-types<Sndr, E>()とし、型CSを下記の通り定義する。
CHECK-TYPE()がコア定数式のとき、opをconnect_result_t<Sndr, Rcvr>型の左辺値とする。CSはcompletion_signaturesの特殊化となり、そのテンプレート引数の集合は評価op.start()の結果結果として得られる完了操作の集合に対応する。- そうでなければ、
CSはcompletion_signatures<>となる。
テンプレートパラメータ制約 : 式CHECK-TYPES()が適格であること。
効果:下記と等価。
CHECK-TYPES();
return CS();
説明専用エンティティ
説明専用のエイリアステンプレートindices-forを下記の通り定義する。
template<class Sndr>
using indices-for = remove_reference_t<Sndr>::indices-for; // exposition only
バージョン
言語
- C++26