非伝搬キャッシュ (C++20)
| template< class T > requires std::is_object_v<T> |
(C++20以降) (説明用*) |
|
ranges::join_view や ranges::lazy_split_view のような一部の範囲アダプタは、値(例: イテレータ)を条件付きで格納します。これは、実装専用のクラステンプレート non-propagating-cache によって指定されます。
このラッパーは std::optional<T> と全く同様に動作しますが、以下の点が異なります。
- コピー構築または代入された際に、ソースの値をコピーしません。
- ムーブされた際に、ソースの値をリセットします。
- 代入された際に、自身の値をリセットします。
- さらに、入力ビューが反復処理される際に一時的に値をキャッシュできるようにするメンバ関数テンプレートを提供します。
このラッパーは、値を保持するキャッシュをカプセル化します。キャッシュのクリアは、保持されている値のリセットと同等の操作です。このような操作は、ラッパーのコピーまたはムーブ時に実行されます。
目次 |
[編集] テンプレートパラメータ
| T | - | 保持される値の型。オブジェクト型でなければなりません。 |
[編集] メンバ関数
コピーおよびムーブコンストラクタ
| constexpr /*non-propagating-cache*/ ( const /*non-propagating-cache*/& ) noexcept {} |
(1) | (C++20以降) |
| constexpr /*non-propagating-cache*/ ( /*non-propagating-cache*/&& other ) noexcept { other.reset(); } |
(2) | (C++20以降) |
other のキャッシュをクリアします。コピーおよびムーブ代入演算子
| constexpr /*non-propagating-cache*/& operator=( const /*non-propagating-cache*/& other ) noexcept |
(1) | (C++20以降) |
| constexpr /*non-propagating-cache*/& operator=( /*non-propagating-cache*/&& other ) noexcept |
(2) | (C++20以降) |
*this のキャッシュをクリアします。*this と other の両方のキャッシュをクリアします。 non-propagating-cache<T>::emplace-deref
| template< class I > constexpr T& /*emplace-deref*/( const I& i ); |
(C++20以降) (説明用*) |
|
*i を使用して、保持される値を直接初期化(ただし、直接リスト初期化ではない)します。呼び出し前に *this が既に値を含んでいる場合、reset() が呼び出されます。
新しく保持される値への参照を返します。
宣言 T t(*i); が、架空の変数 t に対して有効である場合を除き、プログラムは ill-formed です。*i が T の(cv 修飾されている可能性のある)prvalue の場合、移動可能である必要はありません。
[編集] 注釈
non-propagating-cache は、begin() の結果をキャッシュし、メソッドの償却定数時間計算量を提供するために実装で使用されます。
[編集] 関連項目
| (C++20) |
rangeのviewをフラット化して得られるシーケンスからなる view(クラステンプレート) (rangeアダプタオブジェクト) |
rangeのviewをフラット化し、要素の間に区切り文字を挟んで得られるシーケンスからなる view(クラステンプレート) (rangeアダプタオブジェクト) | |
別のviewを区切り文字で分割して得られる部分rangeに対する view(クラステンプレート) (rangeアダプタオブジェクト) | |
別のviewを区切り文字で分割して得られる部分rangeに対する view(クラステンプレート) (rangeアダプタオブジェクト) | |
別のviewの要素をN個ずつの重複しない連続したチャンクにしたviewのrange(クラステンプレート) (rangeアダプタオブジェクト) |