std::ranges::concat_view<Views...>::iterator<Const>::satisfy, prev, advance-fwd, advance-bwd
来自cppreference.com
以下仅用于阐述的成员函数模板用于简化描述。
每个辅助函数模板都有一个 std::size_t 类型的非类型模板形参。
- 如果模板形参的名字是
N,那么模板实参始终是it_.index()。 - 如果模板形参的名字是
I,那么模板实参可以是[0,sizeof...(Views))中的任何 std::size_t 值。
然而模板形参不一定是编译期常量,因此 helper <non_const>(/* 实参 */) 的实际效果类似于
if (non_const == 0)
helper <0>(/* 实参 */);
else if (non_const == 1)
helper <1>(/* 实参 */);
/* 其他索引 */
else if (non_const == (sizeof...(Views) - 1))
helper <sizeof...(Views) - 1>(/* 实参 */);
。
辅助模板
迷你辅助模板
| (1) | (仅用于阐述*) | |
| (2) | (仅用于阐述*) | |
| (3) | (仅用于阐述*) | |
| (4) | (仅用于阐述*) | |
| (5) | (仅用于阐述*) | |
迷你辅助模板简化了主辅助模板和成员函数的描述。C++ 标准文档并未包含这些模板。
1) 获取
it_ 包含的底层迭代器。2) 获取父
concat_view 的第 I 个视图。3) 获取指向父
concat_view 的第 I 个视图开头的迭代器。 返回
ranges::begin(get-view <I>())。4) 获取父
concat_view 的第 I 个视图的尾后迭代器或哨位。 返回
ranges::end(get-view <I>())。 返回
static_cast<std::iter_difference_t<std::variant_alternative_t<I, base-iter >>>(value)。
std::ranges::concat_view::iterator::advance-fwd<N>
| (仅用于阐述*) | ||
将当前(全局)位置前进 steps 步。
- 如果
N是sizeof...(Views) - 1,那么等价于get-iter<N>() +=to-underlying-diff-type(steps);。 - 否则等价于
auto n_size = ranges::distance(get-view<N>()));if (offset + steps < n_size)get-iter<N>() +=to-underlying-diff-type(steps);else{it_.template emplace<N + 1>(get-begin<N + 1>());advance-fwd<N + 1>(0, offset + steps - n_size);}。
参数
| offset | - | 当前(全局)位置到 it_ 当前指向的元素的所属范围开头的距离
|
| steps | - | 要前进的步数 |
std::ranges::concat_view::iterator::advance-bwd<N>
| (仅用于阐述*) | ||
将当前(全局)位置后退 steps 步。
- 如果
N是0,那么等价于get-iter<N>() -=to-underlying-diff-type(steps);。 - 否则等价于
if (offset >= steps)get-iter<N>() -=to-underlying-diff-type(steps);else{auto prev_size = ranges::distance(get-view<N - 1>());it_.template emplace<N - 1>(get-end<N - 1>());advance-bwd<N - 1>(prev_size, steps - offset);}。
参数
| offset | - | 当前(全局)位置到 it_ 当前指向的元素的所属范围开头的距离
|
| steps | - | 要后退的步数 |