Espacios de nombres
Variantes
Acciones

std::ranges::view, std::ranges::enable_view, std::ranges::view_base

De cppreference.com
< cpp‎ | ranges
 
 
Biblioteca de rangos
Adaptadores de rangos
 
Definido en el archivo de encabezado <ranges>
template<class T>
concept view =ranges::range<T>&&std::movable<T>&& ranges::enable_view<T>;
(1) (desde C++20)
template<class T>

inlineconstexprbool enable_view =

    std::derived_from<T, view_base>||/*se-deriva-de-la-interfaz-de-vista*/<T>;
(2) (desde C++20)
struct view_base {};
(3) (desde C++20)
1) El concepto view (vista) especifica los requerimientos de un tipo range (rango) que tiene las propiedades semánticas adecuadas para su uso en la construcción de segmentaciones (pipelines) adaptadoras de rangos.
2) La plantilla de variable enable_view se usa para indicar si un rango (range) es una vista (view). /*se-deriva-de-la-interfaz-de-vista*/<T> es true si y solo si T tiene exactamente una clase base pública ranges::view_interface<U> para algún tipo U, y T no tiene clases base de tipo ranges::view_interface<V> para ningún otro tipo V.
Los usuarios pueden especializar enable_view a true para tipos definidos por el programa, no calificados-cv, que modelen view, y false para tipos que no. Tales especializaciones deben ser usables en expresiones constantes y tener tipo constbool.
3) Derivar de view_base habilita que los tipos range modelen view.

[editar]Requerimientos semánticos

1)T modela view solo si:
  • la construcción por movimiento de T tiene complejidad de tiempo constante, y
  • si N copias o movimientos se hacen desde un objeto T que mantiene M elementos, entonces estos N objetos tienen una destrucción 𝓞(N+M) (lo que implica que un objeto view fuente de una operación de movimiento tiene una destrucción 𝓞(1) ), y
  • o bien std::copy_constructible<T> es false, o la construcción por copia de T tiene complejidad de tiempo constante, y
  • o bien std::copyable<T> es false, o la asignación por copia de T no tiene una complejidad de tiempo mayor que la de la destrucción seguida por construccón por copia.

[editar]Notas

Son ejemplos de tipos view:

  • Un tipo range que envuelve un par de iteradores, por ejemplo, std::ranges::subrange<I>.
  • Un tipo range que mantiene sus elementos por std::shared_ptr y comparte la propiedad con todas sus copias.
  • Un tipo range que genera sus elementos bajo pedido, por ejemplo, std::ranges::iota_view.

Un contenedor copiable como std::vector<std::string> generalmente no cumple con los requerimientos semánticos de view, ya que copiar el contenedor copia todos sus elementos, lo que no puede hacerse en tiempo constante.

Mientras que las vistas se describieron originalmente como descrito como rangos de baratos de copiar y de no propiedad, no se requiere que un tipo sea copiable o de no propiedad para modelar view. Sin embargo, todavía debe ser barato de copiar (si es copiable), mover, asignar y destruir, para que los adaptadores de rangos no tengan una complejidad inesperada.

Por defecto, un tipo que modela movable y range se considera una vista si se deriva pública e inequivocadamente de view_base, o exactamente una especialización de std::ranges::view_interface.

[editar]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 view requería default_initializable No se requiere.
LWG 3549 C++20 enable_view no detectaba herencia de view_interface La detecta.
P2415R2 C++20 La restricción de la complejidad de tiempo de la destrucción era demasiado estricta. Se relajó.
close