最終更新日時: 2025年07月09日 00時33分39秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<ranges>

# std::ranges::subrange(C++20)

    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_kind K`が`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
`cbegin` | 定数イテレータを取得する | C++23
`cend` | 定数イテレータ（番兵）を取得する | C++23

## 推論補助

名前 | 説明 | 対応バージョン
--- | --- | ---
`(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

## バージョン

### 言語

- C++20

### 処理系

- Clang: 13.0.0 ✅
- GCC: 10.1.0 ✅
- ICC: ?
- Visual C++: 2019 Update 10 ✅

## 参照

- N4861 24 Ranges library
- C++20 ranges