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
template<class Sndr, class... Env>
static consteval void check-types();
};
}
概要
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 allocator-aware-forward(std::forward_like<Sndr>(data), rcvr);
}
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)...);
}
check-typesメンバ関数
template<class Sndr, class... Env>
static consteval void default-impls::check-types();
説明用のパックIsを、indices-for<Sndr>で導入されるinteger_sequenceクラス特殊化の整数テンプレート引数とする。
効果:下記と等価。
(get_completion_signatures<child-type<Sndr, Is>, FWD-ENV-T(Env)...>(), ...);
バージョン
言語
- C++26