std::ranges::subrange<I,S,K>::operator PairLike
From cppreference.com
| template< /*different-from*/<subrange> PairLike > requires /*pair-like-convertible-from*/<PairLike, const I&, const S&> |
(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) 型が *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) ペアライクな型が、異なる可能性のある2つの型から構築可能かどうかを決定します。
|
以下と等価です。 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 の特殊化は、range 型であるため、subrange から変換することはできません。
[編集] 例
このコードを実行
#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) (エクスポージャー専用コンセプト*) |