std::projected
| ヘッダ <iterator> で定義 |
||
| (1) | ||
template< std::indirectly_readable I, std::indirectly_regular_unary_invocable<I> Proj > |
(C++20以降) (C++26まで) |
|
| template< std::indirectly_readable I, std::indirectly_regular_unary_invocable<I> Proj > |
(C++26以降) | |
| template< std::weakly_incrementable I, class Proj > struct incrementable_traits<std::projected<I, Proj>> |
(2) | (C++20以降) (C++26まで) |
| template< class I, class Proj > struct /*projected-impl*/ |
(3) | (C++26以降) (説明用*) |
`projected`は、呼び出し可能なオブジェクトとプロジェクションを受け入れるアルゴリズムを制約するためにのみ使用されるため、そのoperator*()は定義されていません。
目次 |
[編集] テンプレートパラメータ
| I | - | 間接的に読み取り可能な型 |
| Proj | - | デリファレンスされた`I`に適用される射影 |
[編集] 備考
間接レイヤーは、`I`と`Proj`が`projected`の関連クラスになるのを防ぎます。`I`または`Proj`の関連クラスが不完全なクラス型である場合、間接レイヤーは、その型の定義を検査する不要な試みを回避し、ハードエラーを防ぎます。
[編集] 例
#include <algorithm> #include <cassert> #include <functional> #include <iterator> template<class T> struct Holder { T t; }; struct Incomplete; using P = Holder<Incomplete>*; static_assert(std::equality_comparable<P>); // OK static_assert(std::indirectly_comparable<P*, P*, std::equal_to<>>); // Error before C++26 static_assert(std::sortable<P*>); // Error before C++26 int main() { P a[10] = {}; // ten null pointers assert(std::count(a, a + 10, nullptr) == 10); // OK assert(std::ranges::count(a, a + 10, nullptr) == 10); // Error before C++26 }
[編集] 関連項目
| (C++26) |
射影によって indirectly_readable 型の値型を計算する(エイリアステンプレート) |