std::ranges::ref_view
| Definido en el archivo de encabezado <ranges>
|
||
template<ranges::range R> requires std::is_object_v<R> class ref_view : public ranges::view_interface<ref_view<R>> |
(desde C++20) | |
ref_view es una vista (view) de los elementos de algún otro rango (range). Envuelve una referencia a ese rango (range).
Datos miembro
ref_view se comporta como si solo almacenara un subobjeto miembro R* al rango al que hace referencia. El miembro aquí se muestra como r_ (el nombre es solo de exposición).
Funciones miembro
(constructor) (C++20) |
Construye un objeto ref_view que hace referencia al rango dado. (función miembro pública) |
base (C++20) |
Devuelve las referencias al rango referenciado. (función miembro pública) |
begin (C++20) |
Devuelve el iterador al comienzo del rango referenciado. (función miembro pública) |
end (C++20) |
Devuelve el centinela del rango referenciado. (función miembro pública) |
empty (C++20) |
Verifica si el rango referenciado está vacío. (función miembro pública) |
size (C++20) |
Devuelve el tamaño del sized_range referenciado. (función miembro pública) |
data (C++20) |
Devuelve el puntero al comienzo del contiguous_range referenciado. (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::ref_view::ref_view
<tbody> </tbody> template</*diferente de*/<ref_view> T> requires std::convertible_to<T, R&> && requires { _FUN(std::declval<T>()); } constexpr ref_view(T&& t); |
(desde C++20) | |
Inicializa r_ con std::addressof(static_cast<R&>(std::forward<T>(t))).
/*diferente de*/<T, U> se satisface si y solo si std::remove_cvref_t<T> y std::remove_cvref_t<U> no son el mismo tipo, y las sobrecargas de _FUN se declaran como void _FUN(R&); void _FUN(R&&) = delete;.
Parámetros
| t | - | El rango a referenciar. |
std::ranges::ref_view::base
<tbody> </tbody> constexpr R& base() const; |
(desde C++20) | |
Equivalente a return *r_;.
std::ranges::ref_view::begin
<tbody> </tbody> constexpr ranges::iterator_t<R> begin() const; |
(desde C++20) | |
Equivalente a return ranges::begin(*r_);.
std::ranges::ref_view::end
<tbody> </tbody> constexpr ranges::sentinel_t<R> end() const; |
(desde C++20) | |
Equivalente a return ranges::end(*r_);.
std::ranges::ref_view::empty
<tbody> </tbody> constexpr bool empty() const requires requires { ranges::empty(*r_); }; |
(desde C++20) | |
Equivalente a return ranges::empty(*r_);.
std::ranges::ref_view::size
<tbody> </tbody> constexpr auto size() const requires ranges::sized_range<R> { return ranges::size(*r_); } |
(desde C++20) | |
std::ranges::ref_view::data
<tbody> </tbody> constexpr auto data() const requires ranges::contiguous_range<R> { return ranges::data(*r_); } |
(desde C++20) | |
Guías de deducción
<tbody> </tbody> template<class R> ref_view(R&) -> ref_view<R>; |
(desde C++20) | |
Plantillas auxiliares
<tbody> </tbody> template<class T> inline constexpr bool enable_borrowed_range<ranges::ref_view<T>> = true; |
(desde C++20) | |
Esta especialización de std::ranges::enable_borrowed_range hace que ref_view satisfaga borrowed_range.
Ejemplo
#include <ranges>
#include <iostream>
int main()
{
const std::string s{"cosmos"};
const std::ranges::take_view tv{s, 3};
const std::ranges::ref_view rv{tv};
std::cout
<< std::boolalpha
<< "llamada a empty() : " << rv.empty() << '\n'
<< "llamada a size() : " << rv.size() << '\n'
<< "llamada a begin() : " << *rv.begin() << '\n'
<< "llamada a end() : " << *(rv.end()-1) << '\n'
<< "llamada a data() : " << rv.data() << '\n'
<< "llamada a base() : " << rv.base().size() << '\n' // ~> tv.size()
<< "for basado en rango : ";
for (const auto c: rv) { std::cout << c; }
std::cout << '\n';
}
Salida:
llamada a empty() : false
llamada a size() : 3
llamada a begin() : c
llamada a end() : s
llamada a data() : cosmos
llamada a base() : 3
for basado en rango : cos
Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
| ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| P2325R3 | C++20 | El constructor por defecto que se proporcionaba como viewdebía ser default_initializable.
|
Se eliminó, así como el requerimiento. |
Véase también
(C++11) |
Envoltorio de referencia CopyConstructible y CopyAssignable. (plantilla de clase) |
(C++20) |
Una vista (view) con propiedad única de algún 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) |