最終更新日時(UTC): 2026年02月08日 09時00分28秒
yoh が更新

履歴 編集

class template
<execution>

# std::execution::impls-for(C++26)

    namespace std::execution {
      template<class Tag>
      struct impls-for : default-impls {};  // exposition only

      struct default-impls {  // exposition only
        static constexpr auto get-attrs = see below;  // exposition only
        static constexpr auto get-env = see below;    // exposition only
        static constexpr auto get-state = see below;  // exposition only
        static constexpr auto start = see below;      // exposition only
        static constexpr auto complete = see below;   // exposition only

        template<class Sndr, class... Env>
        static consteval void check-types();
      };
    }

## 概要

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

説明専用のクラス`default-impls`にてSenderアルゴリズム共通動作を記述し、Senderアルゴリズムタグ型 `Tag`を用いて`impls-for<Tag>`特殊化を定義することでSenderアルゴリズムの固有動作を静的にオーバーライドする。

## 説明専用クラス `default-impls`

### `get-attrs`メンバ

`get-attrs`は、`basic-sender`実装におけるSender属性取得のカスタマイゼーションポイントとして機能する。

`default-impls::get-attrs`メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。

- 子Sender `child`が1個の場合は、その子Senderの属性を転送する。
- それ以外の場合は、空の属性`env<>()`を返す。

    [](const auto&, const auto&... child) noexcept -> decltype(auto) {
      if constexpr (sizeof...(child) == 1)
        return (FWD-ENV(get_env(child)), ...);
      else
        return env<>();
    }

### `get-env`メンバ

`get-env`は、`basic-receiver`実装におけるReceiver環境取得のカスタマイゼーションポイントとして機能する。

`default-impls::get-env`メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。

- 接続先Receiver `rcvr`の環境を転送する。

    [](auto, auto&, const auto& rcvr) noexcept -> decltype(auto) {
      return FWD-ENV(get_env(rcvr));
    }

### `get-state`メンバ

`get-state`は、`basic-operation`実装がメンバ変数として保持する状態(state)取得のカスタマイゼーションポイントとして機能する。

`default-impls::get-state`メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。

- Sender `sndr`オブジェクト構築時の引数を返す。

    []<class Sndr, class Rcvr>(Sndr&& sndr, Rcvr& rcvr) noexcept -> decltype(auto) {
      auto& [_, data, ...child] = sndr;
      return allocator-aware-forward(std::forward_like<Sndr>(data), rcvr);
    }

### `start`メンバ

`start`は、`basic-operation`実装における開始(start)のカスタマイゼーションポイントとして機能する。

`default-impls::start`メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。

- 子Operation State `ops`を逐次的に開始(start)する。

    [](auto&, auto&, auto&... ops) noexcept -> void {
      (execution::start(ops), ...);
    }

### `complete`メンバ

`complete`は、`basic-receiver`実装における各種完了操作のカスタマイゼーションポイントとして機能する。

`default-impls::complete`メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。

- 完了タグ`Tag`と引数リスト`args`を用いて、接続先Receiver `rcvr`の完了操作を呼び出す。
  - `Tag`型は`set_value_t`, `set_error_t`, `set_stopped_t`のいずれか。
- 第1引数`Index`は、`default-impls`実装では利用しない。
  - 複数の子Senderを保持するSenderアルゴリズムの`impls-for`オーバーライド実装で利用する（例 : `when_all`）。

    []<class Index, class Rcvr, class Tag, class... Args>(
      Index, auto& state, Rcvr& rcvr, Tag, Args&&... args) noexcept
        -> void requires callable<Tag, Rcvr, Args...> {
      static_assert(Index::value == 0);
      Tag()(std::move(rcvr), std::forward<Args>(args)...);
    }

### `check-types`メンバ関数

    template<class Sndr, class... Env>
    static consteval void default-impls::check-types();

説明用のパック`Is`を、`indices-for<Sndr>`で導入される`integer_sequence`クラス特殊化の整数テンプレート引数とする。

効果：下記と等価。

    ((void)get_completion_signatures<child-type<Sndr, Is>, FWD-ENV-T(Env)...>(), ...);

## バージョン

### 言語

- C++26

## 関連項目

- `basic-sender`
- `basic-receiver`
- `basic-operation`

## 参照

- P2300R10 `std::execution`
- P3433R1 Allocator Support for Operation States
- P3557R3 High-Quality Sender Diagnostics with Constexpr Exceptions
- LWG4459 Protect `get_completion_signatures` fold expression from overloaded commas