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

履歴 編集

class template
<execution>

std::execution::basic-operation(C++26)

namespace std::execution {
  template<class Sndr, class Rcvr>
    requires valid-specialization<state-type, Sndr, Rcvr> &&
             valid-specialization<connect-all-result, Sndr, Rcvr>
  struct basic-operation : basic-state<Sndr, Rcvr> {  // exposition only
    using operation_state_concept = operation_state_t;
    using tag-t = tag_of_t<Sndr>;                     // exposition only

    connect-all-result<Sndr, Rcvr> inner-ops;         // exposition only

    basic-operation(Sndr&& sndr, Rcvr&& rcvr) noexcept(see below)  // exposition only
      : basic-state<Sndr, Rcvr>(std::forward<Sndr>(sndr), std::move(rcvr)),
        inner-ops(connect-all(this, std::forward<Sndr>(sndr), indices-for<Sndr>()))
    {}

    void start() & noexcept {
      auto& [...ops] = inner-ops;
      impls-for<tag-t>::start(this->state, this->rcvr, ops...);
    }
  };

  template<class Sndr, class Rcvr>
  struct basic-state {             // exposition only
    basic-state(Sndr&& sndr, Rcvr&& rcvr) noexcept(see below)
      : rcvr(std::move(rcvr))
      , state(impls-for<tag_of_t<Sndr>>::get-state(std::forward<Sndr>(sndr), rcvr)) { }

    Rcvr rcvr;                     // exposition only
    state-type<Sndr, Rcvr> state;  // exposition only
  };
}

概要

basic-operationおよびbasic-stateは、Senderアルゴリズム動作仕様定義で用いられる説明専用のクラステンプレートである。

basic-operation<Sndr, Rcvr>operation_stateのモデルであり、SenderアルゴリズムReceiver接続(connect)結果型として利用される。

  • rcvr : 接続先Receiverオブジェクトを保持。Senderアルゴリズム同士を連結する場合は、親Senderアルゴリズム側のReceiverが該当する。
  • state : Senderアルゴリズム構築時の引数リストを保持。(impls-forでカスタマイズ可能)
  • inner-ops : 子SenderリストとSenderアルゴリズムとの接続結果Operation Stateリストを保持。Senderファクトリでは0個、Senderアダプタでは通常1個の子Senderと接続される。

クラス仕様

basic-operationコンストラクタnoexcept節の式は下記の通り。

is_nothrow_constructible_v<basic-state<Self, Rcvr>, Self, Rcvr> &&
noexcept(connect-all(this, std::forward<Sndr>(sndr), indices-for<Sndr>()))

basic-stateコンストラクタnoexcept節の式は下記の通り。

is_nothrow_move_constructible_v<Rcvr> &&
nothrow-callable<decltype(impls-for<tag_of_t<Sndr>>::get-state), Sndr, Rcvr&> &&
(same_as<state-type<Sndr, Rcvr>, get-state-result> ||
 is_nothrow_constructible_v<state-type<Sndr, Rcvr>, get-state-result>)

ここで、説明用の型get-state-resultは下記の通り定義される。

call-result-t<decltype(impls-for<tag_of_t<Sndr>>::get-state), Sndr, Rcvr&>.

説明専用エンティティ

template<template<class...> class T, class... Args>
concept valid-specialization =  // exposition only
  requires { typename T<Args...>; };

template<class Sndr, class Rcvr>  // exposition only
using state-type = decay_t<call-result-t<
  decltype(impls-for<tag_of_t<Sndr>>::get-state), Sndr, Rcvr&>>;

constexpr auto connect-all = see below;  // exposition only

template<class Sndr, class Rcvr>
using connect-all-result = call-result-t<  // exposition only
  decltype(connect-all), basic-state<Sndr, Rcvr>*, Sndr, indices-for<Sndr>>;

template<class Sndr>
using indices-for = remove_reference_t<Sndr>::indices-for;  // exposition only 

説明専用の定数connect-allは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトとして初期化される。

[]<class Sndr, class Rcvr, size_t... Is>(
  basic-state<Sndr, Rcvr>* op, Sndr&& sndr, index_sequence<Is...>) noexcept(see below)
    -> decltype(auto) {
    auto& [_, data, ...child] = sndr;
    return product-type{connect(
      std::forward_like<Sndr>(child),
      basic-receiver<Sndr, Rcvr, integral_constant<size_t, Is>>{op})...};
  }

  • テンプレートパラメータ制約 : ラムダ式中のreturn文の式が適格であること。
  • ラムダ式中のreturn文の式が例外送出する可能性がある場合は、noexcept(false)となる。そうでなければ、noexcept(true)となる。

バージョン

言語

  • C++26

関連項目

参照