std::ranges::views::elements, std::ranges::elements_view
Определено в заголовке <ranges> | ||
|---|---|---|
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) | (с C++20) |
namespace views {
template< std::size_t N >
inline constexpr /* unspecified */ elements = /* unspecified */;
}
| (2) | (с C++20) |
| Подпись вызова | ||
template< ranges::viewable_range R >
requires /* see below */
constexpr ranges::view auto elements<N>( R&& r );
| (с C++20) | |
| Вспомогательные концепции | ||
| (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>&>;
}; |
(до C++23) (только для демонстрации*) | |
template< class T, std::size_t N >
concept has-tuple-element =
tuple-like<T> && N < std::tuple_size_v<T>
| (с C++23) (только для демонстрации*) | |
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) Принимает
view кортежноподобных значений и возвращает вид со значением типа N-го элемента типа значения адаптированного вида.
2) Каждая специализация
views::elements является RangeAdaptorObject. Выражение views::elements<M>(e) является эквивалентным по выражению elements_view<views::all_t<decltype((e))>, M>{e} для любого подходящего подвыражения e и константного выражения M.
3) Гарантирует, что элементы базового вида являются кортежноподобными значениями, см.
tuple-like(с C++23).
4) Гарантирует, что возвращаемые ссылки не могут быть висячими.
elements_view моделирует концепции random_access_range, bidirectional_range, forward_range, input_range, common_range и sized_range, когда базовый вид V моделирует соответствующие концепции.
Члены-функции
|
(C++20) | создаёт elements_view (публичный член-функция) |
|
(C++20) | возвращает копию базового (адаптированного) вида (публичный член-функция) |
|
(C++20) | возвращает итератор начала (публичный член-функция) |
|
(C++20) | возвращает итератор или конечный маркер конца (публичный член-функция) |
|
(C++20) | возвращает количество элементов. Предоставляется только если базовая (адаптированная) область удовлетворяет sized_range. (публичный член-функция) |
Унаследовано от |
|
|
(C++20) | возвращает, пуст ли производный вид. Предоставляется, если он удовлетворяет sized_range или forward_range. (публичный член-функция std::ranges::view_interface<D>) |
|
(C++23) | возвращает постоянный итератор начала области. (публичный член-функция std::ranges::view_interface<D>) |
|
(C++23) | возвращает конечный маркер для постоянного итератора области. (публичный член-функция std::ranges::view_interface<D>) |
|
(C++20) | возвращает, не пуст ли производный вид. Предоставляется, если ranges::empty применима к нему. (публичный член-функция std::ranges::view_interface<D>) |
|
(C++20) | возвращает первый элемент производного вида. Предоставляется, если он удовлетворяет forward_range. (публичный член-функция std::ranges::view_interface<D>) |
|
(C++20) | возвращает последний элемент производного вида. Предоставляется, если он удовлетворяет bidirectional_range и common_range. (публичный член-функция std::ranges::view_interface<D>) |
|
(C++20) | возвращает n-ый элемент производного вида. Предоставляется, если он удовлетворяет random_access_range. (публичный член-функция std::ranges::view_interface<D>) |
Вложенные классы
|
(C++20) | тип итератора (только для демонстрации, шаблон вложенного класса*) |
|
(C++20) | тип конечного маркера (только для демонстрации, шаблон вложенного класса*) |
Вспомогательные шаблоны
template<class T, std::size_t N>
inline constexpr bool enable_borrowed_range<std::ranges::elements_view<T, N>> =
std::ranges::enable_borrowed_range<T>;
| (с C++20) |
Эта специализация std::ranges::enable_borrowed_range позволяет elements_view удовлетворять borrowed_range, когда базовый вид её удовлетворяет.
Пример
#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';
}Вывод:
1 2 3 4 5 A B C D E α β γ δ ε
Отчёты об ошибках
Следующие отчёты об ошибках, меняющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применено к | Поведение при публикации | Правильное поведение |
|---|---|---|---|
| LWG 3494 | C++20 |
elements_view никогда не был borrowed_range | это borrowed_rangeесли его базовое представление — |
| LWG 3502 | C++20 | висячая ссылка могла быть получена из elements_view | такое использование запрещено |
См. также
|
(C++20) | берёт view , состоящий из парных значений, и создаёт view первых элементов каждой пары(шаблон класса) (объект адаптера диапазонов) |
|
(C++20) | берёт view , состоящий из парных значений, и создаёт view вторых элементов каждой пары(шаблон класса) (объект адаптера диапазонов) |
|
(C++23) | view, состоящий из кортежей ссылок на соответствующие элементы адаптированных диапазонов(шаблон класса) (объект точки кастомизации) |
|
(C++23) | view, состоящий из кортежей результатов применения функции преобразования к соответствующим элементам адаптированных диапазонов(шаблон класса) (объект точки кастомизации) |
| Отрезок массива valarray, подобный BLAS: начальный индекс, длина, шаг (класс) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/elements_view