Namespaces
Variants

std::ranges::subrange<I,S,K>:: operator PairLike

From cppreference.net
Ranges library
Range adaptors
template < /*different-from*/ < subrange > PairLike >

requires /*pair-like-convertible-from*/ < PairLike, const I & , const S & >

constexpr operator PairLike ( ) const ;
(1) (начиная с C++20)
Вспомогательные концепты
template < class T >
concept /*pair-like*/ = /* см. описание */ ;
(2) ( только для экспозиции* )
template < class T, class U, class V >
concept /*pair-like-convertible-from*/ = /* см. описание */ ;
(3) ( только для экспозиции* )
1) Преобразует subrange в тип, подобный паре.
Для определения /*different-from*/ , см. different-from .
2) Определяет, является ли тип pair-like .

Эквивалентно:

template< class T >
concept /*pair-like*/ =
    !std::is_reference_v<T> && requires(T t)
    {
        typename std::tuple_size<T>::type;
        requires std::derived_from<std::tuple_size<T>,
                                   std::integral_constant<std::size_t, 2>>;
        typename std::tuple_element_t<0, std::remove_const_t<T>>;
        typename std::tuple_element_t<1, std::remove_const_t<T>>;
        { std::get<0>(t) } -> std::convertible_to<
                                  const std::tuple_element_t<0, T>&>;
        { std::get<1>(t) } -> std::convertible_to<
                                  const std::tuple_element_t<1, T>&>;
    };
(до C++23)

Этот концепт эквивалентен общебиблиотечному экспозиционному концепту pair-like .

(начиная с C++23)
3) Определяет, может ли тип, подобный паре, быть сконструирован из двух значений возможно разных заданных типов.

Эквивалентно:

template< class T, class U, class V >
concept /*pair-like-convertible-from*/ =
    !ranges::range<T> && /*pair-like*/<T> &&
    std::constructible_from<T, U, V> &&
    /*convertible-to-non-slicing*/<U, std::tuple_element_t<0, T>> &&
    std::convertible_to<V, std::tuple_element_t<1, T>>;
(до C++23)

Эквивалентно:

template< class T, class U, class V >
concept /*pair-like-convertible-from*/ =
    !ranges::range<T> && !std::is_reference_v<T> && /*pair-like*/<T> &&
    std::constructible_from<T, U, V> &&
    /*convertible-to-non-slicing*/<U, std::tuple_element_t<0, T>> &&
    std::convertible_to<V, std::tuple_element_t<1, T>>;
(начиная с C++23)

Содержание

Возвращаемое значение

PairLike ( begin_  , end_  )

Примечания

Следующие типы в стандартной библиотеке являются пароподобными:

(начиная с C++26)


Определяемый программой тип, производный от одного из этих типов, может быть пароподобным типом, если

  • std::tuple_size и std::tuple_element корректно специализированы для него, и
  • вызовы std :: get < 0 > и std :: get < 1 > для его значения являются корректными.
(до C++23)

Поскольку специализации subrange являются range типами, преобразование в них не выполняется через данную функцию преобразования.

std::array специализации не могут быть преобразованы из subrange , поскольку они являются range типами.

Пример

#include <iostream>
#include <ranges>
#include <string>
#include <utility>
using striter = std::string::const_iterator;
using legacy_strview = std::pair<striter, striter>;
void legacy_print(legacy_strview p)
{
    for (; p.first != p.second; ++p.first)
        std::cout << *p.first << ' ';
    std::cout << '\n';
}
int main()
{
    std::string dat{"ABCDE"};
    for (auto v{std::ranges::subrange{dat}}; v; v = {v.begin(), v.end() - 1})
    {
        /*...*/
        legacy_print(legacy_strview{v});
    }
}

Вывод:

A B C D E 
A B C D 
A B C 
A B 
A

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

указывает, что тип реализует протокол кортежа
( std::get , std::tuple_element , std::tuple_size )
( концепт только для демонстрации* )