Espacios de nombres
Variantes
Acciones

std::ranges::view_interface

De cppreference.com
< cpp‎ | ranges
 
 
Biblioteca de rangos
Vistas
view_interface
  

Adaptadores de rangos
 
std::ranges::view_interface
Funciones miembro
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
 
Definido en el archivo de encabezado <ranges>
template<class D>

  requires std::is_class_v<D>&&std::same_as<D, std::remove_cv_t<D>>

class view_interface;
(desde C++20)

std::ranges::view_interface es una plantilla de clase auxiliar para definir una interfaz de vista.

view_interface generalmente se usa con el patrón de plantilla curiosamente recurrente (CRTP):

class mi_vista :public std::ranges::view_interface<mi_vista>{public:auto begin()const{/*...*/}auto end()const{/*...*/}// empty() se proporciona si begin() devuelve un iterador de avance// y end() devuelve un centinela para la vista.};

Contenido

[editar]Funciones miembro

(C++20)
Devuelve si la vista derivada está vacía o no. Se proporciona si la vista derivada satisface forward_range.
(función miembro pública)[editar]
Devuelve si la vista derivada está vacía o no. Se proporciona si ranges::empty le es aplicable.
(función miembro pública)[editar]
(C++20)
Obtiene la dirección de los datos de una vista derivada. Se proporciona si su tipo iterador satisface contiguous_iterator.
(función miembro pública)[editar]
(C++20)
Devuelve el número de elementos en la vista derivada. Se proporciona si la vista derivada satisface forward_range y su centinela y tipo iterador satisfacen sized_sentinel_for.
(función miembro pública)[editar]
(C++20)
Devuelve el primer elemento en la vista derivada. Se proporciona si la vista derivada satisface forward_range.
(función miembro pública)[editar]
(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)[editar]
(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)[editar]

[editar]Ejemplo

#include <ranges>#include <vector>#include <iostream>   template<class T, class A>class VistaDeVector :public std::ranges::view_interface<VistaDeVector<T, A>>{public: VistaDeVector()=default; VistaDeVector(conststd::vector<T, A>& vec): m_begin(vec.cbegin()), m_end(vec.cend()){}auto begin()const{return m_begin;}auto end()const{return m_end;}private:typenamestd::vector<T, A>::const_iterator m_begin{}, m_end{};};   int main(){std::vector<int> v ={1, 4, 9, 16};   VistaDeVector vista_sobre_v{v};   // Podemos iterar con begin() y end().for(int n : vista_sobre_v){std::cout<< n <<' ';}std::cout<<'\n';   // Obtenemos operator[] gratis al heredar de view_interface// ya que satisfacemos el concepto random_access_range.for(std::ptrdiff_t i =0; i < vista_sobre_v.size(); i++){std::cout<<"v["<< i <<"] = "<< vista_sobre_v[i]<<'\n';}}

Salida:

1 4 9 16 v[0] = 1 v[1] = 4 v[2] = 9 v[3] = 16

[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
LWG 3549 C++20 Se requería que view_interface se derivara de view_base,
lo que a veces requería múltiples subobjetos view_base en una vista.
Se eliminó la herencia.

[editar]Véase también

Combina un par iterador-centinela en una vista (view).
(plantilla de clase)[editar]
close