最終更新日時: 2026年07月22日 16時08分23秒 (JST)
rotarymars が更新

履歴 編集

function template
<execution>

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

    namespace std::execution {
      template<class Sndr, class... Env>
      consteval auto get_completion_signatures() -> valid-completion-signatures auto;
    }

## 概要

`get_completion_signatures`は、Senderの完了シグネチャ集合を取得する関数テンプレートである。

### 非依存Sender

環境に依存することなく完了シグネチャ集合が決定するSenderは、非依存Sender(non-dependent sender)と呼ばれる。

型`Sndr`に対して`sender<Sndr> == true`かつ`dependent_sender<Sndr> == false`の場合、`Sndr`は非依存Senderである。

## テンプレートパラメータ制約

`sizeof...(Env) <= 1`

## 効果

説明用の式`except`を、`move_constructible<Except> && derived_from<Except, exception>`が`true`となる未規定なクラス`Except`の右辺値とする。`e`がコア定数式かつその型が`valid-completion-signatures`を満たすならば、式`CHECKED-COMPLSIGS(e)`を`e`とする。そうでなければ下記の式となる。

    (e, throw except, completion_signatures())

説明用の式`get-complsigs<Sndr, Env...>()`を、`remove_reference_t<Sndr>::template get_completion_signatures<Sndr, Env...>()`と等価な式とする。

`sizeof...(Env) == 0`が`true`ならば、説明用の型`NewSndr`を`Sndr`とする。そうでなければ、下記の通り定義される式`s`を用いて`decltype(s)`とする。

    transform_sender(
      declval<Sndr>(),
      declval<Env>()...)

下記の通り定義される式`e`を用いて、`return e;`と等価。

- 式`get-complsigs<NewSndr, Env...>()`が適格であるならば、`CHECKED-COMPLSIGS(get-complsigs<NewSndr, Env...>())`
- そうではなく、式`get-complsigs<NewSndr>()`が適格であるならば、`CHECKED-COMPLSIGS(get-complsigs<NewSndr>())`

- そうではなく、`is-awaitable<NewSndr, env-promise<Env>...> == true`ならば

      completion_signatures<
        SET-VALUE-SIG(await-result-type<NewSndr, env-promise<Env>...>),
        set_error_t(exception_ptr),
        set_stopped_t()>

- そうではなく、`sizeof...(Env) == 0`ならば、`(throw dependent-sender-error(), completion_signatures())`

  - 型`dependent-sender-error`は、`dependent_sender_error`もしくは`dependent_sender_error`から曖昧さなく公開派生された未規定の型とする。
- そうでなければ、`(throw except, completion_signatures())`

型`Env`に対して、`completion_signatures_of_t<Sndr>`と`completion_signatures_of_t<Sndr, Env>`ともに適格ならば、エラー完了ないし停止完了操作に関して、前者は後者のスーパーセットであること。

説明用の式`rcvr`を`receiver`のモデルである型`Rcvr`の右辺値、型`Sndr`を`sender_in<Sndr, env_of_t<Rcvr>> == true`となる型とする。 `Sigs...`を`completion_signatures_of_t<Sndr, env_of_t<Rcvr>>`による`completion_signatures`特殊化のテンプレートパラメータと定義する。 `CSO`を完了関数とする。

Sender型`Sndr`、もしくは式`CSO(rcvr, args...)`を呼び出すOperation Stateが潜在的に例外送出するならば、`Sigs...`の完了シグネチャ`Sig`は次の式が`true`となるべき。

    MATCHING-SIG(decayed-typeof<CSO>(decltype(args)...), Sig)

説明用の関数型`F1`, `F2`をそれぞれ`R1(Args1...)`, `R2(Args2...)`としたとき、説明専用の式`MATCHING-SIG(F1, F2)`は、`same_as<R1(Args1&&...), R2(Args&&...)> == true`となる場合にかぎって`true`となる。

## 例

    #include <print>
    #include <execution>
    #include <concepts>
    namespace ex = std::execution;

    int main()
    {
      // 値42を送信するSender
      ex::sender auto sndr = ex::just(42);

      // 値完了シグネチャ set_value_t(int)
      auto sigs = ex::get_completion_signatures<decltype(sndr)>();
      static_assert(std::same_as<decltype(sigs),
        ex::completion_signatures<ex::set_value_t(int)>>);
    }

### 出力

## バージョン

### 言語

- C++26

### 処理系

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

## 関連項目

- `execution::sender`
- `execution::dependent_sender`

## 参照

- P2300R10 `std::execution`
- P3557R3 High-Quality Sender Diagnostics with Constexpr Exceptions
- P3826R5 Fix Sender Algorithm Customization