home | help
std::ranges...ew_interface(3)  C++ Standard Libary std::ranges...ew_interface(3)

NAME
     std::ranges::view_interface - std::ranges::view_interface

Synopsis
	Defined in header <ranges>
	template< class D >

	    requires	     std::is_class_v<D>        &&	 std::same_as<D,
     (since C++20)
	std::remove_cv_t<D>>

	class view_interface;

	std::ranges::view_interface is a helper class template	for  defining  a
     view
	interface.

	view_interface is typically used with CRTP:

      class my_view : public std::ranges::view_interface<my_view>
      {
      public:
	  auto begin() const { /*...*/ }
	  auto end() const { /*...*/ }
	  // empty() is provided if begin() returns a forward iterator
	  // and end() returns a sentinel for it.
      };

Member functions
	empty	       returns whether the derived view is empty. Provided if it
     satisfies
	(C++20)       sized_range or forward_range.
		      (public member function)
	cbegin	      returns a constant iterator to the beginning of the range.
	(C++23)       (public member function)
	cend	      returns a sentinel for the constant iterator of the range.
	(C++23)       (public member function)
	operator bool returns whether the derived view is not empty. Provided if
	(C++20)       ranges::empty is applicable to it.
		      (public member function)
	data	      gets the address of derived view's data. Provided  if  its
     iterator type
	(C++20)       satisfies contiguous_iterator.
		      (public member function)
		      returns  the  number of elements in the derived view. Pro-
     vided if it
	size	      satisfies forward_range and its sentinel and iterator type
     satisfy
	(C++20)       sized_sentinel_for.
		      (public member function)
	front	      returns the first element in the derived view. Provided if
     it
	(C++20)       satisfies forward_range.
		      (public member function)
	back	      returns the last element in the derived view. Provided  if
     it satisfies
	(C++20)       bidirectional_range and common_range.
		      (public member function)
	operator[]     returns the n^th element in the derived view. Provided if
     it satisfies
	(C++20)       random_access_range.
		      (public member function)

Example
     // Run this code

      #include <iostream>
      #include <ranges>
      #include <vector>

      template<class T, class A>
      class VectorView : public std::ranges::view_interface<VectorView<T, A>>
      {
      public:
	  VectorView() = default;

	  VectorView(const std::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:
	  typename std::vector<T, A>::const_iterator m_begin{}, m_end{};
      };

      int main()
      {
	  std::vector<int> v = {1, 4, 9, 16};

	  VectorView view_over_v{v};

	  // We can iterate with begin() and end().
	  for (int n : view_over_v)
	      std::cout << n << ' ';
	  std::cout << '\n';

	  // We get operator[] for free when inheriting from view_interface
	  // since we satisfy the random_access_range concept.
	  for (std::ptrdiff_t i = 0; i != view_over_v.size(); ++i)
	      std::cout << "v[" << i << "] = " << view_over_v[i] << '\n';
      }

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

	Defect reports

	The following behavior-changing defect	reports  were  applied	retroac-
     tively to
	previously published C++ standards.

	   DR	  Applied  to		 Behavior as published		    Cor-
     rect behavior
			    view_interface was required to be derived
	LWG 3549 C++20	    from view_base,				 inheri-
     tance removed
			    which sometimes required multiple view_base
			    subobjects in a view

See also
	ranges::subrange combines an iterator-sentinel pair into a view
	(C++20) 	 (class template)

http://cppreference.com 	   2024.06.10	   std::ranges...ew_interface(3)

home | help