Spec-Zone.ru › C++

Непередающийся кэш (C++20)

template< class T >
    requires std::is_object_v<T>
class /*non-propagating-cache*/;
(начиная с 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)
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) Оператор перемещающего присваивания очищает кэши обоих объектов: *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. Если *i является prvalue-типа, возможно cv-квалифицированного, T, то перемещаемость не требуется.

Члены, идентичные членам std::optional

Функции-члены

(конструктор)
создаёт объект optional
(открытая функция-член std::optional<T>)
(деструктор)
уничтожает содержащееся значение, если оно есть
(открытая функция-член std::optional<T>)
operator=
присваивает содержимое
(открытая функция-член std::optional<T>)
Наблюдатели
operator->operator*
получает доступ к содержащемуся значению
(открытая функция-член std::optional<T>)
operator boolhas_value
проверяет, содержит ли объект значение
(открытая функция-член std::optional<T>)
Модификаторы
reset
уничтожает любое содержащееся значение
(открытая функция-член std::optional<T>)
emplace
создаёт содержащееся значение на месте
(открытая функция-член std::optional<T>)

Примечания

non-propagating-cache используется в реализациях для кэширования результата begin(), чтобы обеспечить амортизированную сложность метода, постоянную по времени.

См. также

ranges::join_viewviews::join
(C++20)
представление view, состоящее из последовательности, полученной путём уплощения view из ranges
(шаблон класса) (объект-адаптер диапазона)
ranges::join_with_viewviews::join_with
(C++23)
представление view, состоящее из последовательности, полученной путём уплощения представления диапазонов с разделителем между элементами
(шаблон класса) (объект-адаптер диапазона)
ranges::split_viewviews::split
(C++20)
представление view, содержащее поддиапазоны, полученные разбиением другого view с помощью разделителя
(шаблон класса) (объект-адаптер диапазона)
ranges::lazy_split_viewviews::lazy_split
(C++20)
представление view, содержащее поддиапазоны, полученные разбиением другого view с помощью разделителя
(шаблон класса) (объект-адаптер диапазона)
ranges::chunk_viewviews::chunk
(C++23)
диапазон представлений views, представляющих собой неперекрывающиеся последовательные фрагменты элементов другого view размером N
(шаблон класса) (объект-адаптер диапазона)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/non-propagating-cache

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API