最終更新日時(UTC): 2026年06月08日 01時13分52秒
yoh が更新

履歴 編集

concept
<execution>

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

    namespace std::execution {
      template <class Sndr>
      concept sender;

      struct sender_tag {};  // タグ型

      template<class Sndr>
      inline constexpr bool enable_sender = see below;
    }

## 概要

`sender`は、型`Sndr`がSender型の要件を満たすことを表すコンセプトである。

下記をみたすクラス型はSenderとみなせる。

- 下記いずれかを満たす
  - `sender_tag`をメンバ型`Sndr::sender_concept`として定義する
  - `enable_sender`変数テンプレートを`true`で特殊化する
  - コルーチンのAwaitable型
- `get_env`で属性を取得できる
- ムーブ可能

## 要件

説明専用コンセプト`is-sender`, `enable-sender`を以下のように定義する。

    template<class Sndr>
    concept is-sender =
      derived_from<typename Sndr::sender_concept, sender_tag>;

    template<class Sndr>
    concept enable-sender =
      is-sender<Sndr> ||
      is-awaitable<Sndr, env-promise<env<>>>;

`enable_sender`変数テンプレートを以下のように定義する。

    template<class Sndr>
    inline constexpr bool enable_sender = enable-sender<Sndr>;

`sender`コンセプトは、以下のように定義される。

    template<class Sndr>
    concept sender =
      enable_sender<remove_cvref_t<Sndr>> &&
      requires (const remove_cvref_t<Sndr>& sndr) {
        { get_env(sndr) } -> queryable;
      } &&
      move_constructible<remove_cvref_t<Sndr>> &&
      constructible_from<remove_cvref_t<Sndr>, Sndr>;

## 備考

プログラム定義型が`sender`コンセプトを満たす場合、ユーザは`enable_sender`変数テンプレートを`true`として特殊化してもよい。そのような特殊化は定数式で利用可能かつ`const bool`型をもつこと。

## 例

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

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

### 出力

## バージョン

### 言語

- C++26

### 処理系

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

## 関連項目

- `execution::sender_in`
- コルーチン

## 参照

- P2300R10 `std::execution`
- LWG 4202. enable-sender should be a variable template
- P4159R0 Make `sender_in` and `receiver_of` exposition-only
- P4154R0 Renaming various execution things