Namespaces
Variants

Не распространяющий кеш (C++20)

с сайта ru.cppreference.net
 
 
Библиотека ranges
Адаптеры диапазонов
 
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
(шаблон класса) (объект адаптера диапазона)