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 ✅