std::ranges::subrange<I,S,K>:: operator PairLike
|
template
<
/*different-from*/
<
subrange
>
PairLike
>
requires
/*pair-like-convertible-from*/
<
PairLike,
const
I
&
,
const
S
&
>
|
(1) | (C++20 起) |
|
辅助概念
|
||
|
template
<
class
T
>
concept /*pair-like*/ = /* 见说明 */ ; |
(2) | ( 仅用于说明* ) |
|
template
<
class
T,
class
U,
class
V
>
concept /*pair-like-convertible-from*/ = /* 见说明 */ ; |
(3) | ( 仅用于说明* ) |
subrange
转换为类似 pair 的类型。
|
等价于: 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 起) |
|
等价于: 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_
)
注释
标准库中的以下类型是类 pair 的:
- std:: pair < T, U >
- std:: tuple < T, U >
- std:: array < T, 2 >
- std :: ranges:: subrange < I, S, K >
|
(自 C++26 起) |
|
若满足以下条件,从这些类型派生的程序定义类型可以成为类 pair 类型:
|
(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 ) ( 仅用于说明的概念* ) |