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 >
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) | |
| Вспомогательные концепты |
||
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>&>;
};
|
(3) | (до 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) | (только для пояснения*) |
N-му элементу типа значения адаптированного представления.views::elements является RangeAdaptorObject. Выражение views::elements<M>(e) является выражением-эквивалентом для elements_view<views::all_t<decltype((e))>, M>{e} для любого подходящего подвыражения e и константного выражения M.elements_view моделирует концепции random_access_range, bidirectional_range, forward_range, input_range, common_range и sized_range, когда базовое представление V моделирует соответствующие концепции.
Члены данных
| Участник | Описание |
V
base_
|
базовое представление
( объект-член только для демонстрации* ) |
Функции-члены
конструирует
elements_view
(публичная функция-член) |
|
|
возвращает копию базового (адаптированного) представления
(публичная функция-член) |
|
|
возвращает итератор на начало
(публичная функция-член) |
|
|
возвращает итератор или страж на конец
(публичная функция-член) |
|
возвращает количество элементов, предоставляется только если базовый (адаптированный) диапазон удовлетворяет
sized_range
(публичная функция-член) |
|
|
(C++26)
|
возвращает приблизительный размер результирующего
approximately_sized_range
(публичная функция-член) |
Унаследовано от ranges::view_interface | |
| возвращает, пусто ли производное представление, применимо только если оно удовлетворяет sized_range или forward_range (открытый элемент-функция std::ranges::view_interface<D>)
| |
(C++23) |
возвращает константный итератор на начало диапазона (открытый элемент-функция std::ranges::view_interface<D>)
|
(C++23) |
возвращает сторожевой элемент для константного итератора диапазона (открытый элемент-функция std::ranges::view_interface<D>)
|
| возвращает, не пусто ли производное представление, применимо только если к нему применим ranges::empty (открытый элемент-функция std::ranges::view_interface<D>)
| |
| возвращает первый элемент в производном представлении, применимо если оно удовлетворяет forward_range (открытый элемент-функция std::ranges::view_interface<D>)
| |
| возвращает последний элемент в производном представлении, применимо только если оно удовлетворяет bidirectional_range и common_range (открытый элемент-функция std::ranges::view_interface<D>)
| |
возвращает n-ый элемент в производном представлении, применимо только если оно удовлетворяет random_access_range (открытый элемент-функция std::ranges::view_interface<D>)
| |
Вложенные классы
|
тип итератора
( демонстрационный шаблон класса-члена* ) |
|
|
тип сторожа
( демонстрационный шаблон класса-члена* ) |
Вспомогательные шаблоны
|
template
<
class
T,
std::
size_t
N
>
constexpr
bool
enable_borrowed_range
<
std
::
ranges
::
elements_view
<
T, N
>>
=
|
(начиная с C++20) | |
Эта специализация
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++.
| 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 |
Смотрите также
|
(C++20)
|
принимает
view
состоящий из пароподобных значений и создаёт
view
первых элементов каждой пары
(шаблон класса) (объект адаптера диапазона) |
принимает
view
состоящий из пароподобных значений и создаёт
view
вторых элементов каждой пары
(шаблон класса) (объект адаптера диапазона) |
|
|
(C++23)
|
view
состоящий из кортежей ссылок на соответствующие элементы адаптированных представлений
(шаблон класса) (объект точки кастомизации) |
view
состоящий из результатов применения функции преобразования к соответствующим элементам адаптированных представлений
(шаблон класса) (объект точки кастомизации) |
|
|
BLAS-подобный срез valarray: начальный индекс, длина, шаг
(класс) |