Namespaces
Variants

Non-propagating cache (C++20)

From cppreference.net
Ranges library
Range adaptors
Helper items
(until C++23) (C++23)
non-propagating-cache


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) (since C++20)
constexpr /*non-propagating-cache*/
( /*non-propagating-cache*/ && other ) noexcept { other. reset ( ) ; }
(2) (since 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) (since C++20)
constexpr /*non-propagating-cache*/ &

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

}
(2) (since 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 типа T (возможно, с cv-квалификаторами), то он не обязан быть перемещаемым.

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

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

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

Примечания

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

Смотрите также

представление, view состоящее из последовательности, полученной путём выравнивания view из range s
(шаблон класса) (объект адаптера диапазона)
представление, view состоящее из последовательности, полученной путём выравнивания представления диапазонов, с разделителем между элементами
(шаблон класса) (объект адаптера диапазона)
представление, view над поддиапазонами, полученными путём разделения другого view с использованием разделителя
(шаблон класса) (объект адаптера диапазона)
представление, view над поддиапазонами, полученными путём разделения другого view с использованием разделителя
(шаблон класса) (объект адаптера диапазона)
диапазон view s , которые являются N -размерными неперекрывающимися последовательными фрагментами элементов другого view
(шаблон класса) (объект адаптера диапазона)