std::ranges::owning_view
| Definido en el archivo de encabezado <ranges>
|
||
template<ranges::range R> requires std::movable<R> && (!/*es-lista-de-inicializadores*/<R>) class owning_view : public ranges::view_interface<owning_view<R>> |
(desde C++20) | |
owning_view es una vista (view) que tiene propiedad única de un rango (range). Es de solo movimiento y almacena ese rango (range) dentro de ella..
La constante /*es-lista-de-inicializadores*/<R> en la clúsula requires es true si y solo si std::remove_cvref_t<R> es una especialización de std::initializer_list.
Datos miembro
Las implementaciones típicas de owning_view solo tienen un dato miembro no estático: el rango subyacente de tipo R. El miembro aquí se muestra como r_ (el nombre es solo de exposición).
Funciones miembro
(constructor) (C++20) |
Construye un objeto owning_view inicializando por valor o por movimiento el rango almacenado. (función miembro pública) |
operator= (C++20) |
Asigna por movimiento el rango almacenado. (función miembro pública) |
base (C++20) |
Devuelve una referencia al rango almacenado. (función miembro pública) |
begin (C++20) |
Devuelve el iterador al comienzo del rango almacenado. (función miembro pública) |
end (C++20) |
Devuelve el centinela del rango almacenado. (función miembro pública) |
empty (C++20) |
Verifica si el rango almacenado está vacío. (función miembro pública) |
size (C++20) |
Devuelve el tamaño del sized_range almacenado. (función miembro pública) |
data (C++20) |
Devuelve el puntero al comienzo del contiguous_range almacenado. (función miembro pública) |
Heredadas de ranges::view_interface | |
(C++20) |
Devuelve si la vista derivada está vacía o no. Se proporciona si ranges::empty le es aplicable. (función miembro pública de std::ranges::view_interface<D>)
|
(C++20) |
Devuelve el primer elemento en la vista derivada. Se proporciona si la vista derivada satisface forward_range. (función miembro pública de std::ranges::view_interface<D>)
|
(C++20) |
Devuelve el último elemento en una vista derivada. Se proporciona si la vista derivada satisface bidirectional_range y common_range. (función miembro pública de std::ranges::view_interface<D>)
|
(C++20) |
Devuelve el enésimo elemento en la vista derivada. Se proporciona si la vista derivada satisface random_access_range. (función miembro pública de std::ranges::view_interface<D>)
|
std::ranges::owning_view::owning_view
owning_view() requires std::default_initializable<R> = default; |
(1) | (desde C++20) |
owning_view( owning_view&& other ) = default; |
(2) | (desde C++20) |
constexpr owning_view( R&& t ); |
(3) | (desde C++20) |
owning_view( const owning_view& ) = delete; |
(4) | (desde C++20) |
= R()).other.t.owning_view es de solo movimiento.Parámetros
| other | - | La otra vista owning_view de la que mover.
|
| t | - | El rango del que mover. |
std::ranges::owning_view::operator=
owning_view& operator=( owning_view&& other ) = default; |
(1) | (desde C++20) |
owning_view& operator=( const owning_view& ) = delete; |
(2) | (desde C++20) |
other.owning_view es de solo movimiento.Parámetros
| other | - | La otra vista owning_view de la que mover.
|
Valor de retorno
*this.
std::ranges::owning_view::base
constexpr R& base() & noexcept; |
(1) | (desde C++20) |
constexpr const R& base() const & noexcept; |
(2) | (desde C++20) |
constexpr R&& base() && noexcept; |
(3) | (desde C++20) |
constexpr const R&& base() const && noexcept; |
(4) | (desde C++20) |
Devuelve una referencia al rango almacenado, manteniendo la categoría de valor y la calificación const.
return r_;.return std::move(r_);.std::ranges::owning_view::begin
constexpr ranges::iterator_t<R> begin(); |
(1) | (desde C++20) |
constexpr auto begin() const requires ranges::range<const R>; |
(2) | (desde C++20) |
Equivalente a return ranges::begin(r_);.
std::ranges::owning_view::end
constexpr ranges::sentinel_t<R> end(); |
(1) | (desde C++20) |
constexpr auto end() const requires ranges::range<const R>; |
(2) | (desde C++20) |
Equivalente a return ranges::end(r_);.
std::ranges::owning_view::empty
constexpr bool empty() requires requires { ranges::empty(r_); }; |
(1) | (desde C++20) |
constexpr bool empty() const requires requires { ranges::empty(r_); }; |
(2) | (desde C++20) |
Equivalente a return ranges::empty(r_);.
std::ranges::owning_view::size
constexpr auto size() requires ranges::sized_range<R>; |
(1) | (desde C++20) |
constexpr auto size() const requires ranges::sized_range<const R>; |
(2) | (desde C++20) |
Equivalente a return ranges::size(r_);.
std::ranges::owning_view::data
constexpr auto data() requires ranges::contiguous_range<R>; |
(1) | (desde C++20) |
constexpr auto data() const requires ranges::contiguous_range<const R>; |
(2) | (desde C++20) |
Equivalente a return ranges::data(r_);.
Plantillas auxiliares
template<class T> inline constexpr bool enable_borrowed_range<std::ranges::owning_view<T>> = std::ranges::enable_borrowed_range<T>; |
(desde C++20) | |
Esta especialización de std::ranges::enable_borrowed_range hace que owning_view satisfaga borrowed_range cuando el rango subyacente lo satisface.
Ejemplo
#include <ranges>
#include <string>
#include <cassert>
#include <iostream>
int main()
{
using namespace std::literals;
std::ranges::owning_view ov{ "cosmos"s }; // el tipo deducido de R es std::string;
// `ov` es el único dueño de esta cadena
std::cout
<< std::boolalpha
<< "llamada a empty() : " << ov.empty() << '\n'
<< "llamada a size() : " << ov.size() << '\n'
<< "llamada a front() : " << ov.front() << '\n' // lo mismo que *(ov.begin())
<< "llamada a back() : " << ov.back() << '\n' // igual a *(ov.end()-1)
<< "llamada a data() : " << ov.data() << '\n'
<< "llamada a base() : " << ov.base().size() << '\n' // ~> ov.size()
<< "sizeof(ov) : " << sizeof(ov) << '\n' // típicamente igual a sizeof(R)
<< "for basado en rango : \"";
for (const char c: ov)
std::cout << c;
std::cout << "\"\n";
std::ranges::owning_view<std::string> ov2;
assert(ov2.empty());
// ov2 = ov; // ERROR: el operador de asignacón de copia está eliminado
ov2 = std::move(ov); // de acuerdo
assert(ov.empty());
assert(ov2.size() == 6);
}
Posible salida:
llamada a empty() : false
llamada a size() : 6
llamada a front() : c
llamada a back() : s
llamada a data() : cosmos
llamada a base() : 6
sizeof(ov) : 32
for basado en rango : "cosmos"
Véase también
(C++20) |
Una vista (view) de los elementos de algún otro rango (range). (plantilla de clase) |
(C++20) |
Una vista (view) que incluye todos los elementos de un rango (range). (plantilla de alias) (objeto adaptador de rango) |