std::ranges::subrange<I,S,K>::operator PairLike
来自cppreference.com
template< /* 见下文 */ 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) | (仅用于阐述*) |
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 前) |
此概念等价于标准库通用的仅用于阐述的概念 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 起) |
返回值
注解
下列类型都是对偶式类型:
- 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) (仅用于阐述的概念*) |