std::ranges::subrange<I,S,K>::operator PairLike
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*/ = /* see description */; | (2) | (только для описания*) |
template< class T, class U, class V > concept /*pair-like-convertible-from*/ = /* see description */; | (3) | (только для описания*) |
1) Преобразует
subrange в тип, подобный паре.
Определение /*different-from*/ см. в
different-from .
2) Определяет, является ли тип подобным паре .
| Эквивалентно: 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) |
| Этот концепт эквивалентен общебиблиотечному концепту, используемому только для описания: | (начиная с 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) |
Возвращаемое значение
Примечания
Следующие типы стандартной библиотеки подобны паре:
- std::pair<T,U>
- std::tuple<T,U>
- std::array<T,2>
- std::ranges::subrange<I,S,K>
| (начиная с C++26) |
| Тип, определённый в программе и производный от одного из этих типов, может быть типом, подобным паре, если
| (до 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
См. также
|
(C++23) | указывает, что тип реализует протокол кортежей ( std::get, std::tuple_element, std::tuple_size)(концепт, используемый только для описания*) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/subrange/operator_PairLike