std::ranges::views::elements, std::ranges::elements_view - cppreference.com (original) (raw)

std::ranges::elements_view

Defined in header
template< ranges::input_range V, std::size_t N > requires ranges::view<V> && /*has-tuple-element*/<ranges::range_value_t<V>, N> && /*has-tuple-element*/<std::remove_reference_t< ranges::range_reference_t<V>>, N> && /*returnable-element*/<ranges::range_reference_t<V>, N> class elements_view : public ranges::view_interface<elements_view<V, N>>; (1) (since C++20)
namespace views { template< std::size_t N > constexpr /* unspecified */ elements = /* unspecified */; } (2) (since C++20)
Call signature
template< ranges::viewable_range R > requires /* see below */ constexpr ranges::view auto elements<N>( R&& r ); (since C++20)
Helper concepts
(3)
template< class T, std::size_t N > concept /*has-tuple-element*/ = requires(T t) { typename std::tuple_size<T>::type; requires N < std::tuple_size_v<T>; typename std::tuple_element_t<N, T>; { std::get<N>(t) } -> std::convertible_to< const std::tuple_element_t<N, T>&>; }; (until C++23) (exposition only*)
template< class T, std::size_t N > concept /*has-tuple-element*/ = /*tuple-like*/<T> && N < std::tuple_size_v<T> (since C++23) (exposition only*)
template< class T, std::size_t N > concept returnable-element = std::is_reference_v<T> | std::move_constructible< std::tuple_element_t<N, T>>; (4)
  1. Accepts a view of tuple-like values, and issues a view with a value type of the Nth element of the adapted view's value-type.

  2. Every specialization of views::elements is a RangeAdaptorObject. The expression views::elements<M>(e) is expression-equivalent to elements_view<views::all_t<decltype((e))>, M>{e} for any suitable subexpression e and constant expression M.

  3. Ensures that the elements of the underlying view are tuple-like values, see tuple-like(since C++23).

  4. Ensures that dangling references cannot be returned.

elements_view models the concepts random_access_range, bidirectional_range, forward_range, input_range, common_range, and sized_range when the underlying view V models respective concepts.

Contents

[edit] Data members

Member Description
V base_ the underlying view(exposition-only member object*)

[edit] Member functions

(constructor) constructs a elements_view (public member function) [edit]
base returns a copy of the underlying (adapted) view (public member function) [edit]
begin returns an iterator to the beginning (public member function) [edit]
end returns an iterator or a sentinel to the end (public member function) [edit]
size returns the number of elements, provided only if the underlying (adapted) range satisfies sized_range (public member function) [edit]
reserve_hint(C++26) returns the approximate size of the resulting approximately_sized_range (public member function) [edit]
Inherited from std::ranges::view_interface
empty returns whether the derived view is empty, provided only if it satisfies sized_range or forward_range (public member function of std::ranges::view_interface) [edit]
cbegin(C++23) returns a constant iterator to the beginning of the range (public member function of std::ranges::view_interface) [edit]
cend(C++23) returns a sentinel for the constant iterator of the range (public member function of std::ranges::view_interface) [edit]
operator bool returns whether the derived view is not empty, provided only if ranges::empty is applicable to it (public member function of std::ranges::view_interface) [edit]
front returns the first element in the derived view, provided if it satisfies forward_range (public member function of std::ranges::view_interface) [edit]
back returns the last element in the derived view, provided only if it satisfies bidirectional_range and common_range (public member function of std::ranges::view_interface) [edit]
operator[] returns the nth element in the derived view, provided only if it satisfies random_access_range (public member function of std::ranges::view_interface) [edit]

[edit] Nested classes

| | the iterator type(exposition-only member class template*) | | ------------------------------------------------------------- | | | the sentinel type(exposition-only member class template*) |

[edit] Helper templates

This specialization of ranges::enable_borrowed_range makes elements_view satisfy borrowed_range when the underlying view satisfies it.

[edit] Example

#include #include #include #include #include   int main() { const std::vector<std::tuple<int, char, std::string>> vt { {1, 'A', "α"}, {2, 'B', "β"}, {3, 'C', "γ"}, {4, 'D', "δ"}, {5, 'E', "ε"}, };   for (int const e : std::views::elements<0>(vt)) std::cout << e << ' '; std::cout << '\n';   for (char const e : vt | std::views::elements<1>) std::cout << e << ' '; std::cout << '\n';   for (std::string const& e : std::views::elements<2>(vt)) std::cout << e << ' '; std::cout << '\n'; }

Output:

1 2 3 4 5 A B C D E α β γ δ ε

[edit] Defect reports

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

DR Applied to Behavior as published Correct behavior
LWG 3494 C++20 elements_view was never a borrowed_range it is a borrowed_rangeif its underlying view is
LWG 3502 C++20 dangling reference could be obtained from elements_view such usage is forbidden

[edit] See also