最終更新日時: 2025年08月31日 19時06分36秒 (JST)
Raclamusi が更新

履歴 編集

function
<ranges>

# std::ranges::zip_view::end(C++23)

    constexpr auto end()
      requires (!(simple-view<Views> && ...));                 // (1) C++23

    constexpr auto end() const
      requires ((range<const Views> && ...) &&
                (random_access_range<const Views> && ...) &&
                (sized_range<const Views> && ...));            // (2) C++23

    constexpr auto end() const
      requires (range<const Views> && ...);                    // (3) C++23

## 概要

番兵を取得する。

## 効果

説明専用コンセプト`zip-is-common`を用いて、

- (1) :

  - `zip-is-common<Views...>`が`false`の場合：
    - `return sentinel<false>(tuple-transform(ranges::end, views_));`
  - `(random_access_range<Views> && ...) && (sized_range<Views> && ...)`が`true`の場合：
    - `return begin() + iter_difference_t<iterator<false>>(size());`
  - それ以外の場合：
    - `return iterator<false>(tuple-transform(ranges::end, views_));`

- (2) : `return begin() + iter_difference_t<iterator<true>>(size());`

- (3) :

    if constexpr (!zip-is-common<const Views...>) {
      return sentinel<true>(tuple-transform(ranges::end, views_));
    }
    else {
      return iterator<true>(tuple-transform(ranges::end, views_));
    }

ここで、`iterator`と`sentinel`は`zip_view`の内部で定義される説明専用のクラスであり、`tuple-transform`は説明専用の関数テンプレートである。

## 例

    #include <ranges>
    #include <vector>
    #include <list>
    #include <iostream>

    int main() {
      std::vector<int> v = {1, 2, 3};
      std::list<char> l = {'a', 'b', 'c', 'd'};

      std::ranges::zip_view zv(v, l);

      auto begin = zv.begin();
      auto end = zv.end();

      // 全要素を出力（短い方のRangeのサイズで終わる）
      for (auto it = begin; it != end; ++it) {
        auto [n, c] = *it;
        std::cout << n << ", " << c << std::endl;
      }
    }

### 出力

    1, a
    2, b
    3, c

## バージョン

### 言語

- C++23

### 処理系

- Clang: 16.0 ✅
- GCC: 13.2 ✅
- Visual C++: 2022 Update 5 ✅

## 参照

- N4950 26.7.25 Zip view