namespace std::this_thread {
struct sync_wait_with_variant_t { unspecified };
inline constexpr sync_wait_with_variant_t sync_wait_with_variant{};
}
概要
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...>>
となる。
効果
説明用のsndr
をdecltype(into_variant(sndr))
がSndr
型となる式とする。
sender_in<Sndr, sync-wait-env> == false
のとき、呼び出し式this_thread::sync_wait_with_variant(sndr)
は不適格となる。
そうでなければ、呼び出し式this_thread::sync_wait_with_variant(sndr)
はsndr
が1回だけ評価されることを除いて、下記と等価。
apply_sender(get-domain-early(sndr), sync_wait_with_variant, sndr)
- 型
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>>;
}
Senderアルゴリズムタグ sync_wait_with_variant
説明用のsndr
をdecltype(into_variant(sndr))
がSndr
型となる式とする。
callable<sync_wait_t, Sndr> == false
のとき、式sync_wait_with_variant.apply_sender(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);
カスタマイゼーションポイント
入力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);
}
出力
result=(100, 'X')
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??