コンセプト

[C++]メンバ型のトリビアル性を継承するロストテクノロジー

std::optionalやstd::variantは保持する型がトリビアルな型であれば、そのトリビアル性を継承することが規格によって求められており、その実装には非常に難解なテクニックが使用されます。しかし、C++20以降、このテクニックは過去のものとなり忘れ去られて…

[C++]indirectly_writableコンセプトの謎の制約式の謎

std::indirectly_writableコンセプトはイテレータによる出力操作を定義するコンセプトで、std::output_iteratorコンセプトの中核部分を成しています。 template<class Out, class T> concept indirectly_writable = requires(Out&& o, T&& t) { *o = std::forward<T>(t); *std::forw</t></class>…

[C++]Forwarding referenceとコンセプト定義

コンセプトを定義するとき、あるいはrequires節で制約式を書くとき、はたまたrequires式でローカルパラメータを使用するとき、その型パラメータがForwarding referenceから来ているものだと使用する際に少し迷う事があります。 // operator*による間接参照が…

[C++]コンセプトの無言のお願い事

等しさの保持(equality preservation) 安定(stable) 定義域(domain) 制約式の引数に対しての制約 requires式とrequires節 暗黙的な式のバリエーション(implicit expression variations) コンセプトのモデルとなるために 参考文献 謝辞 等しさの保持…

[C++]std::common_referenceの概念

C++20より追加されたstd::common_reference<T, U>は型T, U両方から変換可能な共通の参照型を求めるメタ関数です。ただしその結果型は必ずしも参照型ではなかったりします。std::common_typeとの差など、存在理由がよく分からない物でもあります・・・ 同じ事を思う</t,>…

[C++]コンセプトの文脈におけるmeet、satisfyとmodelの使い分けについて

この3つの言葉はどれも、あるコンセプトもしくは制約を満たすという意味で使われています。同じ意味のように思えますが標準ライブラリ中では明確な使い分けがなされています。 old conceptに対するmeet syntactic conceptに対するsatisfy semantic conceptに…

[C++]宇宙船演算子のフォールバック処理

宇宙船演算子の導入によって比較演算子の定義が著しく楽になります。ただ、テンプレートな所ではそう単純にはいかない事もあります。 template<typename T> struct wrap { T v; auto operator<=>(const wrap&) const = default; //Tが<=>を持っていなかったら? //Tが参</typename>…

[C++]コンセプトの5景

C++20にてついに導入されたコンセプト、書け方にムラがあるので少し整理してみます。 1. typenameの代わりに 2. 前置requires節 3. 後置requires節 ※関数のみ 4. autoによる簡略構文 ※関数のみ 5. 1と2(or 3) 4と3 全部盛り 参考文献 謝辞 1. typenameの代わ…