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 { /*...*/ } // empty() は begin() が前方イテレータを返し、 // end() がそのセンチネルを返す場合に提供される };
目次 |
メンバー関数
派生ビューが空かどうかを返す。
sized_range
または
forward_range
を満たす場合にのみ提供される
(公開メンバ関数) |
|
|
(C++23)
|
範囲の先頭を指す定数イテレータを返す
(公開メンバ関数) |
|
(C++23)
|
範囲の定数イテレータに対するセンチネルを返す
(公開メンバ関数) |
|
派生ビューが空でないかどうかを返す。
ranges::empty
が適用可能な場合にのみ提供される
(公開メンバ関数) |
|
派生ビューのデータのアドレスを取得する。イテレータ型が
contiguous_iterator
を満たす場合にのみ提供される
(公開メンバ関数) |
|
派生ビュー内の要素数を返す。
forward_range
を満たし、かつそのセンチネルとイテレータ型が
sized_sentinel_for
を満たす場合に提供される
(公開メンバ関数) |
|
派生ビューの最初の要素を返す。
forward_range
を満たす場合に提供される
(公開メンバ関数) |
|
派生ビューの最後の要素を返す。
bidirectional_range
かつ
common_range
を満たす場合にのみ提供される
(公開メンバ関数) |
|
派生ビューの
n
th
番目の要素を返す。
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++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 3549 | C++20 |
view_interface
は
view_base
からの継承が要求されていたが、
これによりビュー内に複数の
view_base
サブオブジェクトが存在する場合があった
|
継承を削除 |
関連項目
|
(C++20)
|
イテレータとセンチネルのペアを
view
に結合する
(クラステンプレート) |