std::ranges:: view_interface
|
||||||||||||||||||||||
| Range primitives | |||||||
|
|||||||
| Range concepts | |||||||||||||||||||
|
|||||||||||||||||||
| Range factories | |||||||||
|
|||||||||
| Range adaptors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||
| Helper items | |||||||||||||||||
|
|
||||||||||||||||
| Member functions | ||||
|
(C++23)
|
||||
|
(C++23)
|
||||
|
定义于头文件
<ranges>
|
||
|
template
<
class
D
>
requires
std::
is_class_v
<
D
>
&&
std::
same_as
<
D,
std::
remove_cv_t
<
D
>>
|
(C++20 起) | |
std::ranges::view_interface
是一个用于定义视图接口的辅助类模板。
view_interface
通常与
CRTP
结合使用:
class my_view : public std::ranges::view_interface<my_view> { public: auto begin() const { /*...*/ } auto end() const { /*...*/ } // 当begin()返回前向迭代器且end()返回其哨兵时,empty()会自动提供 };
目录 |
成员函数
返回派生视图是否为空,仅在满足
sized_range
或
forward_range
时提供
(公开成员函数) |
|
|
(C++23)
|
返回指向范围起始的常量迭代器
(公开成员函数) |
|
(C++23)
|
返回范围常量迭代器的哨位
(公开成员函数) |
|
返回派生视图是否非空,仅在
ranges::empty
适用于该视图时提供
(公开成员函数) |
|
获取派生视图数据的地址,仅当其迭代器类型满足
contiguous_iterator
时提供
(公开成员函数) |
|
返回派生视图中的元素数量。在满足
forward_range
且其哨位和迭代器类型满足
sized_sentinel_for
时提供
(公开成员函数) |
|
返回派生视图中的首元素,在满足
forward_range
时提供
(公开成员函数) |
|
返回派生视图中的末元素,仅在满足
bidirectional_range
和
common_range
时提供
(公开成员函数) |
|
返回派生视图中第
n
个元素,仅在满足
random_access_range
时提供
(公开成员函数) |
示例
#include <iostream> #include <ranges> #include <vector> template<class T, class A> class VectorView : public std::ranges::view_interface<VectorView<T, A>> { public: VectorView() = default; VectorView(const std::vector<T, A>& vec) : m_begin(vec.cbegin()), m_end(vec.cend()) {} auto begin() const { return m_begin; } auto end() const { return m_end; } private: typename std::vector<T, A>::const_iterator m_begin{}, m_end{}; }; int main() { std::vector<int> v = {1, 4, 9, 16}; VectorView view_over_v{v}; // 我们可以使用 begin() 和 end() 进行迭代。 for (int n : view_over_v) std::cout << n << ' '; std::cout << '\n'; // 通过继承 view_interface,我们自动获得 operator[] // 因为我们满足 random_access_range 概念。 for (std::ptrdiff_t i = 0; i != view_over_v.size(); ++i) std::cout << "v[" << i << "] = " << view_over_v[i] << '\n'; }
输出:
1 4 9 16 v[0] = 1 v[1] = 4 v[2] = 9 v[3] = 16
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 适用范围 | 发布时行为 | 正确行为 |
|---|---|---|---|
| LWG 3549 | C++20 |
view_interface
被要求必须继承自
view_base
,
这有时会导致一个视图包含多个
view_base
子对象
|
移除了继承关系 |
参见
|
(C++20)
|
将迭代器-哨位对组合成
view
(类模板) |