std::ranges::view_interface
From ja.cppreference.net
| ヘッダ <ranges>
|
||
template< class D >
requires std::is_class_v<D> && std::same_as<D, std::remove_cv_t<D>>
class view_interface;
|
(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() is provided if begin() returns a forward iterator
// and end() returns a sentinel for it.
};
メンバー関数
派生ビューが空かどうかを返す。
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
に結合する
(クラステンプレート) |