Namespaces
Variants

std::ranges::ref_view

От ru.cppreference.net
 
 
Библиотека диапазонов
Адаптеры диапазонов
 
Определён в заголовочном файле <ranges>
template< ranges::range R >
    requires std::is_object_v<R>
class ref_view
    : public ranges::view_interface<ref_view<R>>
(начиная с C++20)

ref_view — это view элементов некоторого другого range. Он оборачивает ссылку на этот range.

Члены данных

Участник Описание
R* r_ указатель на базовый диапазон
( объект-член только для демонстрации* )

Функции-члены

создает ref_view , который ссылается на заданный диапазон
(public member function)
возвращает ссылку на ссылочный диапазон
(public member function)
возвращает начальный итератор ссылочного диапазона
(public member function)
возвращает страж ссылочного диапазона
(public member function)
проверяет, является ли ссылочный диапазон пустым
(public member function)
возвращает размер ссылочного sized_range
(public member function)
возвращает приблизительный размер ссылочного approximately_sized_range
(public member function)
возвращает указатель на начало ссылочного contiguous_range
(public member function)
Унаследовано от ranges::view_interface
(C++23)
возвращает константный итератор на начало диапазона
(public-функция-член класса std::ranges::view_interface<D>)
(C++23)
возвращает конечный ограничитель для константного итератора диапазона
(public-функция-член класса std::ranges::view_interface<D>)
возвращает, является ли производное представление непустым, при условии что ranges::empty применимо к нему
(public-функция-член класса std::ranges::view_interface<D>)
возвращает первый элемент в производном представлении, при условии что оно удовлетворяет forward_range
(public-функция-член класса std::ranges::view_interface<D>)
возвращает последний элемент в производном представлении, при условии что оно удовлетворяет bidirectional_range и common_range
(public-функция-член класса std::ranges::view_interface<D>)
возвращает n-й элемент в производном представлении, при условии что оно удовлетворяет random_access_range
(public-функция-член класса std::ranges::view_interface<D>)

std::ranges::ref_view:: ref_view

template < /*different-from*/ < ref_view > T >

requires std:: convertible_to < T, R & > &&
requires { _FUN ( std:: declval < T > ( ) ) ; }

constexpr ref_view ( T && t ) ;
(начиная с C++20)

Инициализирует r_ значением std:: addressof ( static_cast < R & > ( std:: forward < T > ( t ) ) ) .

/*different-from*/ < T, U > выполняется тогда и только тогда, когда std:: remove_cvref_t < T > и std:: remove_cvref_t < U > не являются одним и тем же типом, а перегрузки _FUN объявлены как void _FUN ( R & ) ; void _FUN ( R && ) = delete ; .

Параметры

t - диапазон для ссылки

std::ranges::ref_view:: base

constexpr R & base ( ) const ;
(since C++20)

Возвращает * r_ .

std::ranges::ref_view:: begin

constexpr ranges:: iterator_t < R > begin ( ) const ;
(since C++20)

Возвращает ranges:: begin ( * r_  ) .

std::ranges::ref_view:: end

constexpr ranges:: sentinel_t < R > end ( ) const ;
(начиная с C++20)

Возвращает ranges:: end ( * r_  ) .

std::ranges::ref_view:: empty

constexpr bool empty ( ) const
requires requires { ranges:: empty ( * r_ ) ; } ;
(начиная с C++20)

Возвращает значение ranges:: empty ( * r_  ) .

std::ranges::ref_view:: size

constexpr auto size ( ) const
requires ranges:: sized_range < R > ;
(since C++20)

Возвращает ranges:: size ( * r_  ) .

std::ranges::ref_view:: reserve_hint

constexpr auto size ( ) const
requires ranges :: approximately_sized_range < R > ;
(начиная с C++26)

Возвращает ranges :: reserve_hint ( * r_  ) .

std::ranges::ref_view:: data

constexpr auto data ( ) const
requires ranges:: contiguous_range < R > ;
(since C++20)

Возвращает ranges:: data ( * r_  ) .

Руководства по выводу типа

template < class R >
ref_view ( R & ) - > ref_view < R > ;
(начиная с C++20)

Вспомогательные шаблоны

template < class T >
constexpr bool enable_borrowed_range < ranges :: ref_view < T >> = true ;
(начиная с C++20)

Эта специализация std::ranges::enable_borrowed_range позволяет ref_view удовлетворять требованиям borrowed_range .

Примечания

Макрос тестирования возможностей Значение Стандарт Функция
__cpp_lib_ranges_reserve_hint 202502L (C++26) ranges::approximately_sized_range и reserve_hint

Пример

#include <iostream>
#include <ranges>
int main()
{
    const std::string s{"cosmos"};
    const std::ranges::take_view tv{s, 3};
    const std::ranges::ref_view rv{tv};
    std::cout
        << std::boolalpha
        << "call empty(): " << rv.empty() << '\n'
        << "call size() : " << rv.size() << '\n'
        << "call begin(): " << *rv.begin() << '\n'
        << "call end()  : " << *(rv.end() - 1) << '\n'
        << "call data() : " << rv.data() << '\n'
        << "call base() : " << rv.base().size() << '\n' // ~> tv.size()
        << "range-for   : ";
    for (const auto c : rv)
        std::cout << c;
    std::cout << '\n';
}

Вывод:

call empty(): false
call size() : 3
call begin(): c
call end()  : s
call data() : cosmos
call base() : 3
range-for   : cos

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
P2325R3 C++20 default constructor was provided as
view must be default_initializable
removed along with the requirement

Смотрите также

CopyConstructible и CopyAssignable обёртка ссылки
(шаблон класса)
view с уникальным владением некоторого range
(шаблон класса)
view который включает все элементы range
(псевдоним шаблона) (объект адаптера диапазона)