最終更新日時: 2026年06月12日 16時31分19秒 (JST)
yoh が更新

履歴 編集

function template
<execution>

# std::execution::transform_sender(C++26)

    namespace std::execution {
      template<sender Sndr, queryable Env>
      constexpr decltype(auto) transform_sender(Sndr&& sndr, const Env& env)
        noexcept(see below);
    }

## 概要

実行ドメインに応じてSenderを変換する。 SenderとReceiverとの接続(connect)時のカスタマイゼーションポイントとして機能する。

下記手順によってSender変換が行われる。

- Receiverの環境`evn`に開始ドメインを、Sender`sndr`に完了ドメインをそれぞれ問い合わせる。
- 開始ドメインの上で、恒等変化となるまで（Sender型が変化しなくなるまで）再起的にSender変換を適用する。
- 完了ドメインの上で再起的にSender変換を適用する。同過程でSender型が変化したときは完了ドメインを再度問い合わせる。

## 戻り値

式`s`に対して、`start-domain`を`D()`とする。ここで`D`を適格であるならば式`get_domain(env)`のdecay型、そうでなければ`default_domain`とする。

また`completion-domain(s)`を`D()`とする。ここで`D`を適格であるならば式`get_completion_domain<>(get_env(s), env)`のdecay型、そうでなければ`default_domain`とする。

説明用の式`transformed-sndr(dom, tag, s)`を次の通りとする。

- 適格であるならば、式`dom.transform_sender(tag, s, env)`
- そうでなければ、`default_domain().transform_sender(tag, s, env)`

説明用の式`transform-recurse(dom, tag, s)`を次の通りとする。

- `transformed-sndr(dom, tag, s)`と`s`の型がCV修飾を無視して同一ならば、式`transformed-sndr(dom, tag, s)`
- そうではなく`tag`が`start`のとき、`s2`を`transformed-sndr(dom, tag, s)`、`dom2`を`start-domain`として式`transform-recurse(dom2, tag, s2)`
- そうでなければ、式`completion-domain(s2)`

説明用の式`tmp-sndr`を`transform-recurse(completion-domain(sndr), set_value, sndr)`、式`final-sndr`を`transform-recurse(start-domain, start, tmp-sndr)`とする。

`final-sndr`を返す。

## 例外

例外指定は`noexcept(final-sndr)`に等しい。

## バージョン

### 言語

- C++26

### 処理系

- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??

## 関連項目

- `default_domain::transform_sender`

## 参照

- P2300R10 `std::execution`
- P3826R5 Fix Sender Algorithm Customization