namespace std::execution {
struct then_t { unspecified };
inline constexpr then_t then{};
}
概要
then
は、入力Senderの値完了操作の継続として関数呼び出しをアタッチするSenderアダプタである。
then
はパイプ可能Senderアダプタオブジェクトであり、パイプライン記法をサポートする。
効果
説明用の式sndr
とf
に対して、decltype((sndr))
がsender
を満たさない、もしくはdecltype((f))
がmovable-value
を満たさないとき、呼び出し式then(sndr, f)
は不適格となる。
そうでなければ、呼び出し式then(sndr, f)
はsndr
が1回だけ評価されることを除いて、下記と等価。
transform_sender(get-domain-early(sndr), make-sender(then, f, sndr))
Senderアルゴリズムタグ then
Senderアルゴリズム動作説明用のクラステンプレートimpls-for
に対して、下記の特殊化が定義される。
namespace std::execution {
template<>
struct impls-for<decayed-typeof<then>> : 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_value>>) {
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
が下記を満たさない場合、呼び出し式then(sndr, f)
の動作は未定義となる。
then
に対するsndr
の値結果データでf
またはそのコピーを呼び出し、out_sndr
の値完了としてf
の結果値を用いること。- 他の完了操作では変更なしに転送すること。
例
#include <print>
#include <string>
#include <execution>
namespace ex = std::execution;
int main()
{
{ // 関数呼び出し
ex::sender auto snd0 = ex::just('C', 2);
ex::sender auto snd1 = ex::then(snd0, [](char ch, int n) {
return ch + std::string(n, '+');
});
auto [s] = std::this_thread::sync_wait(snd1).value();
std::println("{}", s);
}
{ // パイプライン記法
ex::sender auto sndr = ex::just('C', 2);
| ex::then([](char ch, int n) {
return ch + std::string(n, '+');
});
auto [s] = std::this_thread::sync_wait(sndr).value();
std::println("{}", s);
}
}
出力
C++
C++
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??