namespace std::execution {
struct upon_stopped_t { unspecified };
inline constexpr upon_stopped_t upon_stopped{};
}
概要
upon_stopped
は、入力Senderの停止完了操作の継続として関数呼び出しをアタッチし、戻り値データを正常完了として送信するSenderアダプタである。
upon_stopped
はパイプ可能Senderアダプタオブジェクトであり、パイプライン記法をサポートする。
効果
説明用の式sndr
とf
に対して、decltype((sndr))
がsender
を満たさない、もしくはdecltype((f))
がmovable-value
を満たさないとき、呼び出し式upon_stopped(sndr, f)
は不適格となる。
そうでなければ、呼び出し式upon_stopped(sndr, f)
はsndr
が1回だけ評価されることを除いて、下記と等価。
transform_sender(get-domain-early(sndr), make-sender(upon_stopped, f, sndr))
Senderアルゴリズムタグ upon_error
Senderアルゴリズム動作説明用のクラステンプレートimpls-for
に対して、下記の特殊化が定義される。
namespace std::execution {
template<>
struct impls-for<decayed-typeof<upon_stopped>> : default-impls {
static constexpr auto complete =
[]<class Tag, class... Args>
(auto, auto& fn, auto& rcvr, Tag, Args&&... args) noexcept -> void {
if constexpr (same_as<Tag, decayed-typeof<set_stopped>>) {
TRY-SET-VALUE(rcvr,
invoke(std::move(fn), std::forward<Args>(args)...));
} else {
Tag()(std::move(rcvr), std::forward<Args>(args)...);
}
};
};
}
カスタマイゼーションポイント
Senderアルゴリズム構築時およびReceiver接続時に、関連付けられた実行ドメインに対してexecution::transform_sender
経由でSender変換が行われる。
デフォルト実行ドメインでは無変換。
戻り値のSenderout_sndr
が下記を満たさない場合、呼び出し式upon_stopped(sndr, f)
の動作は未定義となる。
upon_stopped
に対するsndr
の停止結果データでf
またはそのコピーを呼び出し、out_sndr
の値完了としてf
の結果値を用いること。- 他の完了操作では変更なしに転送すること。
例
#include <print>
#include <execution>
namespace ex = std::execution;
int main()
{
{ // 関数呼び出し
ex::sender auto snd0 = ex::just_stopped();
ex::sender auto snd1 = ex::upon_stopped(snd0, []() {
return 42;
});
auto [v] = std::this_thread::sync_wait(snd1).value();
std::println("{}", v);
}
{ // パイプライン記法
ex::sender auto sndr = ex::just_stopped()
| ex::upon_stopped([]() {
return 42;
});
auto [v] = std::this_thread::sync_wait(sndr).value();
std::println("{}", v);
}
}
出力
42
42
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??