|
Range primitives | |||||||
|
Range concepts | |||||||||||||||||||
|
Range factories | |||||||||
|
Range adaptors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
Helper items | |||||||||||||||||
|
Defined in header <ranges> | ||
template<class D> requiresstd::is_class_v<D>&&std::same_as<D,std::remove_cv_t<D>> | (since C++20) | |
std::ranges::view_interface
is a helper class template for defining a view interface.
view_interface
is typically used withCRTP:
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.};
Contents |
returns whether the derived view is empty, provided only if it satisfiessized_range orforward_range (public member function)[edit] | |
(C++23) | returns a constant iterator to the beginning of the range (public member function)[edit] |
(C++23) | returns a sentinel for the constant iterator of the range (public member function)[edit] |
returns whether the derived view is not empty, provided only ifranges::empty is applicable to it (public member function)[edit] | |
gets the address of derived view's data, provided only if its iterator type satisfiescontiguous_iterator (public member function)[edit] | |
returns the number of elements in the derived view. Provided if it satisfiesforward_range and its sentinel and iterator type satisfysized_sentinel_for .(public member function)[edit] | |
returns the first element in the derived view, provided if it satisfiesforward_range (public member function)[edit] | |
returns the last element in the derived view, provided only if it satisfiesbidirectional_range andcommon_range (public member function)[edit] | |
returns then th element in the derived view, provided only if it satisfiesrandom_access_range (public member function)[edit] |
#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(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}; 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 16v[0] = 1v[1] = 4v[2] = 9v[3] = 16
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 3549 | C++20 | view_interface was required to be derived fromview_base ,which sometimes required multiple view_base subobjects in a view | inheritance removed |
(C++20) | combines an iterator-sentinel pair into aview (class template)[edit] |