名前空間
変種
操作

非伝搬キャッシュ (C++20)

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
ヘルパーアイテム
(C++23まで)  (C++23)
non-propagating-cache


 
template< class T >

    requires std::is_object_v<T>

class /*non-propagating-cache*/;
(C++20以降)
(説明用*)

ranges::join_viewranges::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以降)
1) コピーコンストラクタは何も影響を与えません。
2) ムーブコンストラクタは other のキャッシュをクリアします。

コピーおよびムーブ代入演算子

constexpr /*non-propagating-cache*/&

    operator=( const /*non-propagating-cache*/& other ) noexcept
{
    if (std::addressof(other) != this)
        reset();
    return *this;

}
(1) (C++20以降)
constexpr /*non-propagating-cache*/&

    operator=( /*non-propagating-cache*/&& other ) noexcept
{
    reset();
    other.reset();
    return *this;

}
(2) (C++20以降)
1) コピー代入演算子は、*this のキャッシュをクリアします。
2) ムーブ代入演算子は、*thisother の両方のキャッシュをクリアします。

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 です。*iT の(cv 修飾されている可能性のある)prvalue の場合、移動可能である必要はありません。

std::optional と同一のメンバ

メンバ関数

optional オブジェクトを構築する
(std::optional<T> の public メンバ関数) [編集]
保持されている値があれば、それを破棄する
(std::optional<T> の public メンバ関数) [編集]
内容を代入する
(std::optional<T> の public メンバ関数) [編集]
監視
保持されている値にアクセスする
(std::optional<T> の public メンバ関数) [編集]
オブジェクトが値を保持しているか確認する
(std::optional<T> の public メンバ関数) [編集]
変更
保持されている値を破棄する
(std::optional<T> の public メンバ関数) [編集]
保持する値を直接構築する
(std::optional<T> の public メンバ関数) [編集]

[編集] 注釈

non-propagating-cache は、begin() の結果をキャッシュし、メソッドの償却定数時間計算量を提供するために実装で使用されます。

[編集] 関連項目

rangeviewをフラット化して得られるシーケンスからなる view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
rangeのviewをフラット化し、要素の間に区切り文字を挟んで得られるシーケンスからなる view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
別のviewを区切り文字で分割して得られる部分rangeに対する view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
別のviewを区切り文字で分割して得られる部分rangeに対する view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
別のviewの要素をN個ずつの重複しない連続したチャンクにしたviewのrange
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)