std::ranges::view_interface
From cppreference.com
| ヘッダ <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() is provided if begin() returns a forward iterator // and end() returns a sentinel for it. };
目次 |
[編集] メンバ関数
派生ビューが空かどうかを返す。sized_range または forward_range を満たす場合にのみ提供される(public member function) | |
| (C++23) |
範囲の先頭への定数イテレータを返す (public member function) |
| (C++23) |
範囲の定数イテレータの番兵を返す (public member function) |
| 派生ビューが空でないかどうかを返す。ranges::empty が適用可能な場合にのみ提供される (public member function) | |
イテレータ型が contiguous_iterator を満たす場合にのみ、派生ビューのデータのアドレスを取得する(public member function) | |
派生ビューの要素数を返します。これは、派生ビューが forward_range を満たし、そのセンチネルとイテレータ型が sized_sentinel_for を満たす場合に提供されます。(public member function) | |
派生ビューが forward_range を満たす場合に、派生ビューの最初の要素を返す(public member function) | |
派生ビューが bidirectional_range と common_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す(public member function) | |
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す(public member function) |
[編集] 例
このコードを実行
#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}; // We can iterate with begin() and end(). for (int n : view_over_v) std::cout << n << ' '; std::cout << '\n'; // We get operator[] for free when inheriting from view_interface // since we satisfy the random_access_range concept. 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に結合する(クラステンプレート) |