コンセプト の検索結果:
…ent_senderコンセプトを満たす。例:Receiver環境を読み取るread_envアルゴリズム(→id:yohhoy:20250612)が生成するSender。 Sender型Sndrの非依存Sender/依存Sender区分は、コンパイル時に静的メンバ関数テンプレートをSndr::get_completion_signatures<Sndr>()形式で呼び出したときにexecution::dependent_sender_error例外を送出*3する(依存Sende…
…処理フレームワークのコンセプト・基本操作 → id:yohhoy:20250609 非同期処理ビルディングブロックとしてのSenderアルゴリズム → id:yohhoy:20250612 C++コルーチン(→id:yohhoy:20180415)とSenderの相互運用サポート コルーチンAwaitable==Sender C++コルーチンにおいてco_await演算子オペランドに指定可能なAwaitableオブジェクトは、実行制御ライブラリのSenderとしてReceiv…
…処理フレームワークのコンセプト・基本操作 → id:yohhoy:20250609 非同期処理ビルディングブロックとしてのSenderアルゴリズム C++コルーチンとSenderの相互運用サポート → id:yohhoy:20250613 Senderアルゴリズム Senderアルゴリズム(sender algorithm)はSenderを引数/戻り値とする関数であり、 下記3つのカテゴリに区分される。C++2c標準ライブラリでは、Senderアルゴリズムは全てCPO(Cus…
…ームワークを構成するコンセプト(concept)や、基本的な操作CPO(Customization Point Object)(→id:yohhoy:20190403)を定義する。*1 非同期処理ビルディングブロックとしてのSenderアルゴリズムを定義する。→ id:yohhoy:20250612 C++コルーチンとSenderの相互運用をサポートする。→ id:yohhoy:20250613 // C++2c #include <execution> #include <…
…のリフレクション値 コンセプト(concept) クラステンプレート(class template) 関数テンプレート(function template) 変数テンプレート(primary variable template) エイリアステンプレート(alias template) 型(type) 型エイリアス(type alias) 関数(function) 変数(variable) 構造化束縛(structured binding) 列挙子(enumerator) 非s…
…uctible<T>コンセプトに関するメモ。ある型Tが「例外送出なしにデストラクト可能」と制約(constraint)するコンセプト。デストラクタは既定で暗黙のnothrow指定が行われるため*1、明示的にnothrow(false)指定を行わない限りあらゆるオブジェクト型が満たすコンセプトとなる。*2std::destructibleコンセプトは、標準ヘッダ <concepts> 提供のオブジェクト関連コンセプトにより直接/間接的に包摂(subsume)される。 std::…
…ew。 入出力レンジコンセプト レンジアダプタの適用対象Vが満たすコンセプトに対して、適用結果の外部(Outer)レンジ/内部(Inner)レンジが満たすコンセプトは下表の通り。*5 入力\出力 splitOuter splitInner lazy_splitOuter lazy_splitInner input *6 (N/A) (N/A) input input forward forward forward forward forward bidirectional f…
…7e15c6bd34a std::ranges::constant_rangeコンセプトやstd::views::as_constレンジアダプタはC++2b(C++23)標準ライブラリへの追加予定機能。関連URL P2278R4 cbegin should always return a constant iterator James Bond in C++ Standard - yohhoyの日記 ジュラシック・パーク in C++ Standard - yohhoyの日記
…ratorはviewコンセプトとinput_rangeコンセプトのモデル。範囲for文や各種レンジアダプタ(range adaptor)と組み合わせて利用可能。 標準ヘッダ<ranges>の拡張 std::ranges::elements_of<R, Allocator>クラステンプレート(Rはrangeコンセプトのモデル、Allocatorは省略可) elements_ofはco_yield式に対するタグ型として機能する。 ジェネレータ利用側イテレータの提供型 Refere…
…+標準ライブラリ提供コンセプト定義における包摂関係(subsumption relation)としても表現されている(→id:yohhoy:20190903)。C++20 18.4.9/p4, 18.6/p1より一部引用。 template<class T> concept swappable = requires(T& a, T& b) { ranges::swap(a, b); }; // (snip) [Note: The semantics of the swappa…
C++20コンセプトでは制約式(constraint-expression)を&&(conjunction)/||(disjunction)で組み合わせることで複雑な制約式を表現できる。一方で制約式が多数の原子制約(atomic constraint)から構成されるケースでは、包摂関係(subsumption relation)判定のための正規化プロセスが複雑になりコンパイル時間に悪影響を及ぼす。例えばコンセプトX, Y, Zからなるコンセプトの定義方法として、下記2種類が考…
…::copyableコンセプトを満たすことを要求するため。C++17互換イテレータではコピー可能・ムーブ可能を要求するが、C++20 Rangeを構成するイテレータはコピー不可・ムーブ可能であればよい。*2前掲コードのようにRange/Viewからコンテナへ変換したい場合、次期C++2b(C++23)標準ライブラリではstd::views::toレンジアダプタ(→id:yohhoy:20210902)が利用可能となる。 // C++2b(C++23) #include <ss…
…+20言語仕様では、コンセプト定義に対して属性(attribute)を指定できない。 2024-08-13追記:本件はCWG 2428でC++20 DRとして修正され、コンセプト(concept)に対するdeprecated属性指定が許可される。属性指定位置に注意。 // OK: CWG 2428適用後 template <typename T> concept C [[deprecated("concept")]] = /*...*/; template <typename…
…定するメタ関数およびコンセプト実装例。 2025-07-25追記:C++2c(C++26) Reflection(→id:yohhoy:20250305)を利用した実装は id:yohhoy:20250725 参照。 // C++11/14/17: is_complexメタ関数 #include <complex> #include <type_traits> template <typename T> struct is_complex : std::false_type …
C++20コンセプトと論理演算子(&&, ||)による畳み込み式(fold expression)の関係について。本記事の内容はStackOverflowで見つけた質問と回答に基づく。まとめ:&&と||による畳み込み式を用いた制約式(constraint-expression)は機能するものの、C++20現在ではコンセプト間の包摂関係(subsumption relation)は期待通りに成り立たない。 2024-07-21追記:C++2c(C++26)標準ライブラリでは提案…
…ion) において、コンセプトや条件式を用いた制約(constraints)表現には注意が必要。 2022-05-08追記:gcc(g++) 12.1から警告 -Wmissing-requires が追加され、本記事で言及しているrequiresキーワード指定忘れの可能性を検知できる。本警告は既定で有効化される。*1下記コードのように式std::signed_integral<decltype(N)>やN == 42をrequires式中に単に記載すると単純要件(simple…
…stの時にrangeコンセプトを満たさないのは何故? - スタック・オーバーフロー filter_viewがconst-iterableではない理由 std::string_viewでは値渡しを利用する - yohhoyの日記 const, mutableキーワードとスレッド安全性 - yohhoyの日記 C++11標準ライブラリのスレッド安全性 - yohhoyの日記 *1:C++20 Rangesライブラリ仕様のベースとされた range-v3 ライブラリでは、要素に対し…
…_generatorコンセプトで同テクニックが利用される。C++20 26.6.2.3/p1より引用。 A uniform random bit generator g of type G is a function object returning unsigned integer values such that each value in the range of possible results has (ideally) equal probability of b…
…ertible_toコンセプトの超微妙な違い。本記事の内容はStackOverflowで見つけた質問と回答に基づく。要約: is_convertible<From, To>メタ関数:From型からTo型へ暗黙変換できることを検査する。 convertible_to<From, To>コンセプト:From型からTo型へ暗黙変換および明示変換できることを検査する。 暗黙変換は可能だが明示変換が許可されないケースで差異が生じる。ジェネリックライブラリの設計者大変すぎでしょ。 #in…
…バT::mを確認するコンセプト(?) template <typename T> concept HasStaticM = requires { { T::m } -> std::convertible_to<int>; }; // 式 T::m はmがstaticメンバのときのみ有効 assert( X::m == 1 ); // OK static_assert( HasStaticM<X> ); // OK // mが非staticメンバの場合は式 T::m と書けない…
C++20コンセプトで導入されたrequires節と、テンプレート特殊化の組み合わせには注意が必要。例えば制約付きプライマリテンプレート(#1)に対してdouble型で明示的特殊化(#2)しようとしても、下記記述コードでは#2定義でill-formedになる。これは#1のrequires節によりT=doubleのときプライマリテンプレート不在とみなされるため。 #include <concepts> // #1 プライマリテンプレート(?) template<typename…
…+2a(C++20)コンセプトにおける原子制約(atomic constraint)では、パラメータ置換(parameter mapping)の失敗はハードエラー(ill-formed)を引き起こさず、その制約式を満たさない(not satisfied)と解釈される。C++17現在はstd::void_tやstd::conjunctionを駆使した難解なテンプレートメタプログラミング技法が要求されるが、C++2aでは単純な制約式記述によるコンセプト定義により代替される。はず。…
…+2a(C++20)コンセプトの制約式(constraint-expression)では、論理演算&&, ||は短絡評価される。*1C++17現在のテンプレートメタプログラミングではstd::conjunction, std::disjunctionメタ関数を必要とするが、C++2aコンセプト導入により自然な制約記述が可能となる。 T型が「std::atomic<T>が常にロックフリー(lock free)か否か」を判定するメタ関数は、std::conjunctionメタ関数…
…+2a(C++20)コンセプト requires式(requires-expression) に記述する 複合要件(compound-requirement) では「ある式の評価結果が特定コンセプトを満たすこと」を制約するが、このとき標準コンセプトstd::same_as/std::convertible_toを適切に使い分ける必要がある。特に “データメンバ型の制約” には注意すること。下記コードのコンセプトC0では式t.dataがint型へと変換可能(convertibl…
…+2a(C++20)コンセプトでは制約式(constraint-expression)に論理積(&&)/論理和(||)/論理否定(!)を表現できるが、制約式を用いたオーバーロード解決では通常の論理演算で期待される ド・モルガンの法則(De Morgan's laws) は適用されない。*1超要約:否定演算!を使ったコンセプトには要注意! // C++2a #include <concepts> // integral, same_asコンセプト template <typen…
…2a(C++20) コンセプト requires式(requires-expression) では、同式を包含するコンテキストのあらゆる宣言を利用できる。下記コードのrequires式からは関数テンプレートの仮引数xを参照している。requires式の本体(requirement-body)は評価されず(unevaluated)、型情報(型T)のみを利用している。 #include <iostream> #include <string> using namespace st…
…t_iteratorコンセプト(concept) の変遷についてメモ。まとめ: C++2a(C++20) input_iteratorコンセプトではイテレータ型にoperator*オーバーロードのみ要求する。operator->オーバーロードは要求されない。 C++17以前の InputIterator 要件では、イテレータ型に対してoperator*とoperator->オーバーロードの両方を要求する。 N4835(C++2a WD) Cpp17InputIterator要…
…ライブラリ提供の標準コンセプトstd::same_as、およびコンセプト定義における対称包摂イディオム(Symmetric Subsumption Idiom)についてメモ。制約式std::same_as<X, Y>と制約式std::same_as<Y, X>は対称関係、つまり互いに一方が他方を包摂する(subsume)関係にある。これによりコンセプトへのテンプレートパラメータ指定順が一致していなくとも、制約式を用いた関数オーバーロード解決の半順序関係を表現できる。 // C…
…+20)で導入されるコンセプト(concept)に関して、制約式(constraint-expression)間の包摂(subsume)ルールに基づくオーバーロード解決のメモ。本記事の内容はStackOverflowで見つけた質問と回答に基づく。要約:制約式の包摂関係(subsumption relation)判定では、制約を構成するトークン列が同じというだけではダメで、C++ソースコード上での記述位置(=構文木におけるノード)の同一性が考慮される。こんなん分かる気がしない_…
…ブラリに導入される コンセプト(concept) の名前付けガイドラインについて。2019年Cologne会合にて (PDF)P1754R1 が採択され、Ranges TS提案当初から PascalCase 形式で検討されていた命名規則から snake_case 形式へと変更された。これにより従来C++標準ライブラリとの一貫性は向上したが、その名前のみからはコンセプトなのかクラスやメタ関数*1なのかを判別しづらくなっている。*2提案文書P1851R0では、P1754R1から改…