最終更新日時(UTC): 2026年06月06日 13時00分57秒
yoh が更新

履歴 編集

concept
<execution>

# std::queryable(C++26)

    template<class T>
    concept queryable = destructible<T>;

## 概要

`queryable`は、型`T`がクエリ可能オブジェクトの制約を満たすことを表す説明専用のコンセプトである。

### クエリ可能オブジェクト(queryable object)

クエリ可能オブジェクトは、クエリオブジェクトをキーとして対応する値を保持する、読み取り専用のKey/Valueデータ構造とみなせる。

- `execution::env<>{}` : 空のクエリ可能オブジェクト
- `execution::prop(q, v)` : キー`q`と対応値`v`を保持する最小のクエリ可能オブジェクト
- `execution::env{...}` : 複数のKey/Valueを保持するクエリ可能オブジェクト
- `queryable`コンセプトを満たすユーザ定義クラスのオブジェクト

実行制御ライブラリでは、下記のオブジェクトがクエリ可能オブジェクトとされる。

- Senderに関連付けられた属性(attributes)オブジェクト（`execution::get_env`で取得）
- Receiverに関連付けられた環境(environment)オブジェクト（`execution::get_env`で取得）
- Schedulerオブジェクト自身

### クエリオブジェクト(query object)

クエリオブジェクトは、クエリ可能オブジェクトに対する問い合わせ(query)を行うカスタマイゼーションポイントオブジェクトである。

説明用のクエリオブジェクト`q`、クエリ可能オブジェクト`env`、引数パック`args`としたとき

- 問い合わせ式`q(env, args...)`は、`void`型であってはならない。
- 問い合わせ式`q(env, args...)`は、クエリオブジェクトや引数を変更せず、等しさを保持(equality-preserving)する。
- 式`env.query(q, args...)`が適格であれば、問い合わせ式`q(env, args...)`と等価である。

## モデル

説明用の`env`を`Env`型のオブジェクトとする。 呼び出し可能オブジェクト`q`と部分式パック`args`に対して、`requires { q(env, args...) }`が`true`であれば、`q(env, args...)`が`q`に課されるセマンティック要件を満たす場合に、`Env`は`queryable`のモデルである。

## 説明専用エンティティ

### 式`TRY-QUERY`

説明用の部分式`q`, `tag`、パック`args`に対して、式`TRY-QUERY(q, tag, args...)`は適格であるならば`AS-CONST(q).query(tag, args...)`と等価な式である。そうでなければ、`args...`が評価されることを除いて`AS-CONST(q).query(tag)`と等価な式である。

### 式`HIDE-SCHED`

説明用の部分式`q`, `tag`、パック`args`に対して、`tag`のdecayed型が`get_scheduler_t`または`get_domain_t`のとき、式`HIDE-SCHED(q)`は`o.query(tag, args...)`が不適格となるオブジェクト`o`とする。そうでなければ、`q.query(tag, args...)`とする。

### 式`MAKE-ENV`

説明用のクエリオブジェクト`q`、部分式`v`、部分式のパック`args`に対して、式`MAKE-ENV(q, v)`は`queryable`を満たす型の式`env`となり、下記を満たす。

- `env.query(q, args...)`の結果が`v`と等しい。
- 明に規定されない限り、`env`が有効の間は`env.query(q, args...)`のオブジェクトも有効である。

### 式`JOIN-ENV`

説明用のクエリ可能オブジェクト`env1`, `env2`、クエリオブジェクト`q`、パック式`as`に対して、式`JOIN-ENV(env1, env2)`は`queryable`を満たす型の式`env3`となり、式`env3.query(q, as...)`は下記と等価である。

- 適格であるならば、式`env1.query(q, as...)`
- そうではなく、適格であるならば、式`env2.query(q, as...)`
- そうでなければ、式`env3.query(q, as...)`は不適格

## 備考

Senderに関連付けられたクエリ可能オブジェクトは「属性(attributes)」と呼ばれるが、実行制御ライブラリの仕様記述ではReceiverの「環境(environment)」と合わせて`Env`型や識別子名`env`として包括的に言及される。

## バージョン

### 言語

- C++26

## 関連項目

- `execution::prop`
- `execution::env`
- `execution::get_env`

## 参照

- P2300R10 `std::execution`
- P3826R5 Fix Sender Algorithm Customization