Skip to content

Latest commit

 

History

History
138 lines (105 loc) · 5.8 KB

File metadata and controls

138 lines (105 loc) · 5.8 KB

sync_wait_with_variant

  • execution[meta header]
  • cpo[meta id-type]
  • std::this_thread[meta namespace]
  • cpp26[meta cpp]
namespace std::this_thread {
  struct sync_wait_with_variant_t { unspecified };
  inline constexpr sync_wait_with_variant_t sync_wait_with_variant{};
}
  • unspecified[italic]

概要

sync_wait_with_variantは、入力Senderが完了するまで現在のスレッドをブロックし、非同期操作の結果を取得するSenderコンシューマである。

sync_wait_with_variantは入力Senderが複数の値完了シグネチャを持つケースに対応する。 値完了シグネチャが1個だけの場合はsync_waitアルゴリズムを利用する。

入力Senderの値完了シグネチャがset_value_t(Ts0...), ..., set_value_t(TsN...)のとき、sync_wait_with_variantの結果型はoptional<variant<tuple<Ts0...>, ..., tuple<TsN...>>となる。

効果

説明用のsndrdecltype(into_variant(sndr))Sndr型となる式とする。

呼び出し式this_thread::sync_wait_with_variant(sndr)sndrが1回だけ評価されることを除いて、下記と等価。

apply_sender(get-domain-early(sndr), sync_wait_with_variant, sndr)
  • apply_sender[link ../execution/apply_sender.md]
  • get-domain-early[link ../execution/get-domain-early.md]
  • sender_in<Sndr, sync-wait-env> == trueであること。
  • sync-wait-with-variant-result-type<Sndr>が適格であること。
  • 上記のapply_sender式をeとしたとき、same_as<decltype(e), sync-wait-with-variant-result-type<Sndr>> == trueであること。

結果型

sync_wait_with_variantの結果型となる、説明専用のエイリアステンプレートsync-wait-with-variant-result-typeを下記の通り定義する。

namespace std::this_thread {
  template<execution::sender_in<sync-wait-env> Sndr>
  using sync-wait-with-variant-result-type =
    optional<execution::value_types_of_t<Sndr, sync-wait-env>>;
}
  • execution::sender_in[link ../execution/sender_in.md]
  • sync-wait-env[link sync-wait-env.md]
  • execution::value_types_of_t[link ../execution/value_types_of_t.md]
  • optional[link /reference/optional/optional.md]

Senderアルゴリズムタグ sync_wait_with_variant

説明用のsndrdecltype(into_variant(sndr))Sndr型となる式とする。

sync_wait_with_variant.apply_sender(sndr)は下記と等価。

using result_type = sync-wait-with-variant-result-type<Sndr>;
if (auto opt_value = sync_wait(into_variant(sndr))) {
  return result_type(std::move(get<0>(*opt_value)));
}
return result_type(nullopt);
  • sync_wait[link sync_wait.md]
  • into_variant[link ../execution/into_variant.md]
  • std::move[link /reference/utility/move.md]
  • get<0>[link /reference/tuple/tuple/get.md]
  • nullopt[link /reference/optional/nullopt_t.md]

カスタマイゼーションポイント

入力Sendersndr関連付けられた実行ドメインdomに対して、 execution::apply_sender経由でdom.apply_sender(sync_wait_with_variant, sndr)が呼ばれる。

デフォルト実行ドメインでは、sync_wait_with_variant.apply_sender(sndr)が呼ばれる。

下記を満たさない場合、呼び出し式this_thread::sync_wait_with_variant(sndr)の動作は未定義となる。

  • 指定したSenderが完了するまで、前方進行保証委任(forward progress guarantee delegation)による現在のスレッドをブロックすること。
  • 指定したSenderの非同期操作の結果が返る場合

#include <print>
#include <execution>
namespace ex = std::execution;

int main()
{
  // 値(100, 'X')を送信するSender
  ex::sender auto sndr = ex::just(100, 'X');
  // メインスレッド上で完了待機
  auto result = std::this_thread::sync_wait_with_variant(sndr);
  // 結果型optional<variant<tuple<int,char>>>からtupleを取り出す
  auto tup = get<0>(result.value());
  std::println("result={}", tup);
}
  • std::this_thread::sync_wait_with_variant[color ff0000]
  • ex::sender[link ../execution/sender.md]
  • ex::just[link ../execution/just.md]
  • get<0>[link /reference/variant/variant/get.md]
  • value()[link /reference/optional/optional/value.md]

出力

result=(100, 'X')

バージョン

言語

  • C++26

処理系

関連項目

参照