namespace std::ranges {
template<input_or_output_iterator I, sentinel_for<I> S = I, subrange_kind K = sized_sentinel_for<S, I> ? subrange_kind::sized : subrange_kind::unsized>
requires (K == subrange_kind::sized || !sized_sentinel_for<S, I>)
class subrange : public view_interface<subrange<I, S, K>> { …… };
}
概要
subrange
は、イテレータi
と番兵s
が表す範囲[i, s)
をRangeとして扱うクラステンプレート。
subrange
はborrowed_range
、view
のモデルであり、また、大きさ2のtuple-likeな型である。第0要素はイテレータ、第1要素は番兵。
subrange
はsized_range
である場合(K == subrange_kind::sized
)とそうでない場合(K == subrange_kind::unsized
)の両方をサポートする。
また、元のRangeがsized_range
でなくても、長さを別に指定することでsized_range
になれる。
テンプレートパラメータ制約
subrange_kindK
がsized
である。または、イテレータI
と番兵S
がsized_sentinel_for
を満たさない。
メンバ関数
名前 | 説明 | 対応バージョン |
---|---|---|
(constructor) |
コンストラクタ | C++20 |
operator PairLike |
pair-likeな型に変換する | C++20 |
begin |
先頭を指すイテレータを取得する | C++20 |
end |
番兵を取得する | C++20 |
empty |
Rangeが空かどうかを判定する | C++20 |
size |
要素数を取得する | C++20 |
next |
先頭を前進させた部分Rangeを得る | C++20 |
prev |
先頭を後退させた部分Rangeを得る | C++20 |
advance |
部分Rangeの先頭を動かす | C++20 |
継承しているメンバ関数
名前 | 説明 | 対応バージョン |
---|---|---|
operator bool |
Rangeが空でないかどうかを判定する | C++20 |
data |
配列の先頭へのポインタを取得する | C++20 |
front |
先頭要素への参照を取得する | C++20 |
back |
末尾要素への参照を取得する | C++20 |
operator[] |
要素へアクセスする | C++20 |
推論補助
名前 | 説明 | 対応バージョン |
---|---|---|
(deduction_guide) |
クラステンプレートの推論補助 | C++20 |
カスタマイゼーション
名前 | 説明 | 対応バージョン |
---|---|---|
enable_borrowed_range |
enable_borrowed_range の特殊化 (variable template) |
C++20 |
タプルインターフェース
名前 | 説明 | 対応バージョン |
---|---|---|
tuple_size |
静的な要素数取得(class template) | C++20 |
tuple_element |
静的な要素の型取得(class template) | C++20 |
get |
要素を取得する(function template) | C++20 |
説明専用コンセプト
このクラスの説明では以下のコンセプトを用いる。
// uses-nonqualification-pointer-conversion: 直接変換できない型同士のポインタの変換が必要
template<class From, class To>
concept uses-nonqualification-pointer-conversion =
is_pointer_v<From> && is_pointer_v<To> &&
!convertible_to<remove_pointer_t<From>(*)[], remove_pointer_t<To>(*)[]>;
// convertible-to-non-slicing: スライシングを起こさずに変換できる
template<class From, class To>
concept convertible-to-non-slicing =
convertible_to<From, To> &&
!uses-nonqualification-pointer-conversion<decay_t<From>, decay_t<To>>;
// pair-like: 大きさ2のtuple-likeな型である
template<class T>
concept pair-like =
!is_reference_v<T> && requires(T t) {
typename tuple_size<T>::type;
requires derived_from<tuple_size<T>, integral_constant<size_t, 2>>;
typename tuple_element_t<0, remove_const_t<T>>;
typename tuple_element_t<1, remove_const_t<T>>;
{ get<0>(t) } -> convertible_to<const tuple_element_t<0, T>&>;
{ get<1>(t) } -> convertible_to<const tuple_element_t<1, T>&>;
};
// pair-like-convertible-from: U, Vから構築できるpair-likeである (その際、Uはスライシングを起こさない)
template<class T, class U, class V>
concept pair-like-convertible-from =
!range<T> && pair-like<T> &&
constructible_from<T, U, V> &&
convertible-to-non-slicing<U, tuple_element_t<0, T>> &&
convertible_to<V, tuple_element_t<1, T>>;
バージョン
言語
- C++20
処理系
- Clang: 13.0.0
- GCC: 10.1.0
- ICC: ?
- Visual C++: 2019 Update 10