std::ranges::views::elements, std::ranges::elements_view
<ranges>
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
template< std::size_t N >
constexpr /* unspecified */ elements = /* unspecified */;
requires /* see below */
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>&>;
(exposition only*)
concept /*has-tuple-element*/ =
(exposition only*)
concept returnable-element =
std::is_reference_v <T> || std::move_constructible <
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.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.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
V
base_
the underlying view(exposition-only member object*)
[edit] Member functions
sized_range
(public member function) [edit]
approximately_sized_range
(public member function) [edit]
Inherited from std::ranges::view_interface
sized_range
or forward_range
(public member function of
std::ranges::view_interface<D>
) [edit]
(public member function of
std::ranges::view_interface<D>
) [edit]
(public member function of
std::ranges::view_interface<D>
) [edit]
(public member function of
std::ranges::view_interface<D>
) [edit]
forward_range
(public member function of
std::ranges::view_interface<D>
) [edit]
bidirectional_range
and common_range
(public member function of
std::ranges::view_interface<D>
) [edit]
n
th element in the derived view, provided only if it satisfies random_access_range
(public member function of
std::ranges::view_interface<D>
) [edit]
[edit] Nested classes
[edit] Helper templates
constexpr bool enable_borrowed_range<std::ranges::elements_view<T, N>> =
This specialization of ranges::enable_borrowed_range makes elements_view
satisfy borrowed_range
when the underlying view satisfies it.
[edit] Example
#include <iostream> #include <ranges> #include <string> #include <tuple> #include <vector> 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_range if its underlying view is |
LWG 3502 | C++20 | dangling reference could be obtained from elements_view
|
such usage is forbidden |
[edit] See also
view
consisting of pair-like values and produces a view
of the first elements of each pair(class template) (range adaptor object)[edit]
view
consisting of pair-like values and produces a view
of the second elements of each pair(class template) (range adaptor object)[edit]
view
consisting of tuples of references to corresponding elements of the adapted views(class template) (customization point object)[edit]