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

履歴 編集

customization point object
<execution>

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

namespace std::execution {
  struct then_t { unspecified };
  inline constexpr then_t then{};
}

概要

thenは、入力Sender値完了操作の継続として関数呼び出しをアタッチするSenderアダプタである。

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

効果

説明用の式sndrfに対して、decltype((sndr))senderを満たさない、もしくはdecltype((f))movable-valueを満たさないとき、呼び出し式then(sndr, f)不適格となる。

そうでなければ、呼び出し式then(sndr, f)sndrが1回だけ評価されることを除いて、下記と等価。

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

処理系

関連項目

参照