namespace std::execution {
template <class Sndr>
concept sender;
struct sender_t {}; // タグ型
}
概要
sender
は、型Sndr
がSender型の要件を満たすことを表すコンセプトである。
下記をみたすクラス型はSenderとみなせる。
- 下記いずれかを満たす
sender_t
をメンバ型Sndr::sender_concept
として定義する- コルーチンのAwaitable型
get_env
で属性を取得できる- ムーブ可能
要件
説明専用コンセプトis-sender
, enable-sender
を以下のように定義する。
template<class Sndr>
concept is-sender =
derived_from<typename Sndr::sender_concept, sender_t>;
template<class Sndr>
concept enable-sender =
is-sender<Sndr> ||
is-awaitable<Sndr, env-promise<env<>>>;
sender
コンセプトは、以下のように定義される。
template<class Sndr>
concept sender =
bool(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
コンセプトの制約式に現れる第1項bool(enable-sender<...>)
は原子制約(atomic constraint)を構成する。
これによりオーバーロード解決時の優先順比較においてenable-sender
コンセプトの||
を単純なOR条件とみなせ、コンパイル時の複雑な包摂関係計算コストを抑制できる。
例
#include <execution>
namespace ex = std::execution;
int main()
{
// 値42を送信するSender
ex::sender auto sndr = ex::just(42);
}
出力
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??