namespace std::execution {
template<class Tag>
struct impls-for : default-impls {}; // exposition only
struct default-impls { // exposition only
static constexpr auto get-attrs = see below; // exposition only
static constexpr auto get-env = see below; // exposition only
static constexpr auto get-state = see below; // exposition only
static constexpr auto start = see below; // exposition only
static constexpr auto complete = see below; // exposition only
};
}
概要
impls-for
は、Senderアルゴリズム動作仕様定義で用いられる説明専用のクラステンプレートである。
説明専用のクラスdefault-impls
にてSenderアルゴリズム共通動作を記述し、Senderアルゴリズムタグ型Tag
を用いてimpls-for<Tag>
特殊化を定義することでSenderアルゴリズムの固有動作を静的にオーバーライドする。
説明専用クラス default-impls
get-attrs
メンバ
get-attrs
は、basic-sender
実装におけるSender属性取得のカスタマイゼーションポイントとして機能する。
default-impls::get-attrs
メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。
[](const auto&, const auto&... child) noexcept -> decltype(auto) {
if constexpr (sizeof...(child) == 1)
return (FWD-ENV(get_env(child)), ...);
else
return env<>();
}
get-env
メンバ
get-env
は、basic-receiver
実装におけるReceiver環境取得のカスタマイゼーションポイントとして機能する。
default-impls::get-env
メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。
[](auto, auto&, const auto& rcvr) noexcept -> decltype(auto) {
return FWD-ENV(get_env(rcvr));
}
get-state
メンバ
get-state
は、basic-operation
実装がメンバ変数として保持する状態(state)取得のカスタマイゼーションポイントとして機能する。
default-impls::get-state
メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。
- Sender
sndr
オブジェクト構築時の引数を返す。
[]<class Sndr, class Rcvr>(Sndr&& sndr, Rcvr& rcvr) noexcept -> decltype(auto) {
auto& [_, data, ...child] = sndr;
return std::forward_like<Sndr>(data);
}
start
メンバ
start
は、basic-operation
実装における開始(start)のカスタマイゼーションポイントとして機能する。
default-impls::start
メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。
- 子Operation State
ops
を逐次的に開始(start)する。
[](auto&, auto&, auto&... ops) noexcept -> void {
(execution::start(ops), ...);
}
complete
メンバ
complete
は、basic-receiver
実装における各種完了操作のカスタマイゼーションポイントとして機能する。
default-impls::complete
メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。
- 完了タグ
Tag
と引数リストargs
を用いて、接続先Receiverrcvr
の完了操作を呼び出す。Tag
型はset_value_t
,set_error_t
,set_stopped_t
のいずれか。
- 第1引数
Index
は、default-impls
実装では利用しない。- 複数の子Senderを保持するSenderアルゴリズムの
impls-for
オーバーライド実装で利用する(例 :when_all
)。
- 複数の子Senderを保持するSenderアルゴリズムの
[]<class Index, class Rcvr, class Tag, class... Args>(
Index, auto& state, Rcvr& rcvr, Tag, Args&&... args) noexcept
-> void requires callable<Tag, Rcvr, Args...> {
static_assert(Index::value == 0);
Tag()(std::move(rcvr), std::forward<Args>(args)...);
}
バージョン
言語
- C++26