Non-propagating cache (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) | (since C++20) |
|
constexpr
/*non-propagating-cache*/
( /*non-propagating-cache*/ && other ) noexcept { other. reset ( ) ; } |
(2) | (since C++20) |
Операторы копирующего и перемещающего присваивания
|
constexpr
/*non-propagating-cache*/
&
operator
=
(
const
/*non-propagating-cache*/
&
other
)
noexcept
|
(1) | (since C++20) |
|
constexpr
/*non-propagating-cache*/
&
operator
=
(
/*non-propagating-cache*/
&&
other
)
noexcept
|
(2) | (since C++20) |
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
(
)
для обеспечения амортизированной постоянной временной сложности метода.
Смотрите также
|
(C++20)
|
представление,
view
состоящее из последовательности, полученной путём выравнивания
view
из
range
s
(шаблон класса) (объект адаптера диапазона) |
представление,
view
состоящее из последовательности, полученной путём выравнивания представления диапазонов, с разделителем между элементами
(шаблон класса) (объект адаптера диапазона) |
|
|
(C++20)
|
представление,
view
над поддиапазонами, полученными путём разделения другого
view
с использованием разделителя
(шаблон класса) (объект адаптера диапазона) |
представление,
view
над поддиапазонами, полученными путём разделения другого
view
с использованием разделителя
(шаблон класса) (объект адаптера диапазона) |
|
|
(C++23)
|
диапазон
view
s
, которые являются
N
-размерными неперекрывающимися последовательными фрагментами элементов другого
view
(шаблон класса) (объект адаптера диапазона) |