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) |
Accepts a view of tuple-like values, and issues a view with a value type of the
N
th element of the adapted view's value-type.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.Ensures that the elements of the underlying view are tuple-like values, see tuple-like(since C++23).
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
- 1 Data members
- 2 Member functions
- 3 Nested classes
- 4 Helper templates
- 5 Example
- 6 Defect reports
- 7 See also
[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 |