std::ranges::views::common, std::ranges::common_view
Определено в заголовке <ranges> | ||
|---|---|---|
template< ranges::view V >
requires (not ranges::common_range<V> and
std::copyable<ranges::iterator_t<V>>)
class common_view
: public ranges::view_interface<common_view<V>>
| (1) | (с C++20) |
namespace views {
inline constexpr /* unspecified */ common = /* unspecified */;
}
| (2) | (с C++20) |
| Вызов функции | ||
template< ranges::viewable_range R >
requires /* see below */
constexpr ranges::view auto common( R&& r );
| (с C++20) |
1) Преобразует заданный
2) RangeAdaptorObject. Пусть view с различными типами для пары итератор/сторож в view, который также является common_range. У common_view всегда одинаковый тип итератора/сторожа.e будет подвыражением. Тогда выражение views::common(e) эквивалентно выражению: -
views::all(e), если это корректное выражение иdecltype((e))соответствуетcommon_range; -
common_view{e}в противном случае.
Члены данных
| Название члена | Определение |
|---|---|
base_ (приватный) | Базовое представление типа V.(только для иллюстрации*) |
Члены-функции
|
(C++20) | создаёт common_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) | получает адрес данных производного представления. Доступно, если его тип итератора удовлетворяет contiguous_iterator. (публичный член-функция 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>) |
Правила вывода
Вспомогательные шаблоны
template< class T >
inline constexpr bool enable_borrowed_range<std::ranges::common_view<T>> =
std::ranges::enable_borrowed_range<T>;
| (с C++20) |
Эта специализация std::ranges::enable_borrowed_range делает common_view удовлетворяющим borrowed_range, когда базовое представление удовлетворяет ему.
Примечания
common_view может быть полезно при работе со старыми алгоритмами, которые ожидают, что итератор и сторож имеют одинаковый тип.
Пример
#include <iostream>
#include <iterator>
#include <list>
#include <numeric>
#include <ranges>
int main()
{
auto v1 = {1, 2, 3, 4, 5};
auto i1 = std::counted_iterator{v1.begin(), std::ssize(v1)};
auto r1 = std::ranges::subrange{i1, std::default_sentinel};
// auto e1 = std::accumulate(r1.begin(), r1.end(), 0); // error: "common range" required
auto c1 = std::ranges::common_view{r1};
std::cout << "accumulate: " << std::accumulate(c1.begin(), c1.end(), 0) << '\n';
// inherited from ranges::view_interface:
std::cout << "c1.front(): " << c1.front() << '\n';
std::cout << "c1.back(): " << c1.back() << '\n';
std::cout << "c1.data(): " << c1.data() << '\n';
std::cout << "c1[0]: " << c1[0] << '\n';
auto v2 = std::list{1, 2, 3, 4, 5};
auto i2 = std::counted_iterator{v2.begin(), std::ssize(v2)};
auto r2 = std::ranges::subrange{i2, std::default_sentinel};
// auto e2 = std::accumulate(r2.begin(), r2.end(), 0); // error: "common range" required
auto c2 = std::ranges::common_view{ r2 };
std::cout << "accumulate: " << std::accumulate(c2.begin(), c2.end(), 0) << '\n';
// inherited from ranges::view_interface:
std::cout << "c2.front(): " << c2.front() << '\n';
// auto e3 = c2.back(); // error: "bidirectional range" required
// auto e4 = c2.data(); // error: "contiguous range" required
// auto e5 = c2[0]; // error: "random access range" required
}Возможный вывод:
accumulate: 15 c1.front(): 1 c1.back(): 5 c1.data(): 0x7f19937f00d0 c1[0]: 1 accumulate: 15 c2.front(): 1
Отчеты о дефектах
Следующие отчеты о дефектах, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применимо к | Поведение как опубликовано | Правильное поведение |
|---|---|---|---|
| LWG 3494 | C++20 |
common_view никогда не был borrowed_range | является borrowed_range , если его базовое представление является |
См. также
|
(C++20) | определяет, что диапазон имеет одинаковые типы итератора и сторожа (концепция) |
|
(C++20) | преобразует тип итератора и его сторожа в общий тип итератора (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/common_view