最終更新日時(UTC):
が更新

履歴 編集

customization point object
<execution>

std::execution::upon_stopped(C++26)

namespace std::execution {
  struct upon_stopped_t { unspecified };
  inline constexpr upon_stopped_t upon_stopped{};
}

概要

upon_stoppedは、入力Sender停止完了操作の継続として関数呼び出しをアタッチし、戻り値データを正常完了として送信するSenderアダプタである。

upon_stoppedパイプ可能Senderアダプタオブジェクトであり、パイプライン記法をサポートする。

効果

説明用の式sndrfに対して、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

処理系

関連項目

参照