view_interface
クラス (C++ 標準ライブラリ)
std::ranges
名前空間の view クラスの基本クラス。 このクラスは、派生ビュー型のインターフェイスの一部を実装します。 これを独自のビュー型の基本クラスとして使用して、記述する必要がある定型を減らします。
構文
template<class Derived>
requires std::is_class_v<Derived> &&
std::same_as<Derived, std::remove_cv_t<Derived>>
class view_interface;
テンプレート パラメーター
Derived
この基底クラスから派生するクラスの型。
メンバー
メンバー関数 | 説明 |
---|---|
back C++20 |
派生ビューの最後の要素を取得します。 |
data C++20 |
派生ビューの最初の要素へのポインターを取得します。 |
empty C++20 |
派生ビューが空かどうかをテストします。 |
front C++20 |
派生ビューの最初の要素を取得します。 |
size C++20 |
派生ビュー内の要素の数を取得します。 |
演算子 | 説明 |
operator[] C++20 |
指定した位置にある要素を取得します。 |
operator bool C++20 |
派生ビューが空でないかどうかをテストします。 |
要件
Header: <ranges>
(C++20 以降)
名前空間: std::ranges
コンパイラ オプション: /std:c++20
以降が必要です。
back
派生ビューの最後の要素を取得します。
constexpr auto back()
requires ranges::bidirectional_range<Derived> &&
ranges::common_range<Derived>;
constexpr auto back() const
requires ranges::bidirectional_range<const Derived> &&
ranges::common_range<const Derived>;
パラメーター
ありません。
戻り値
派生ビューの最後の要素。
解説
派生ビューは、 bidirectional_range
と common_range
を満たす必要があります。
back()
とfront()
の動作は、空のビューでは定義されていません。
data
派生ビューの最初の要素へのポインターを取得します。
constexpr auto data()
requires std::contiguous_iterator<ranges::iterator_t<Derived>>;
constexpr auto data() const
requires ranges::range<const Derived> &&
std::contiguous_iterator<ranges::iterator_t<const Derived>>;
パラメーター
ありません。
戻り値
派生ビューの最初の要素へのポインター。
解説
派生ビューの反復子は、 contiguous_iterator
を満たす必要があります。
empty
派生ビューが空かどうかをテストします。
1) constexpr bool empty() requires ranges::forward_range<Derived>;
2) constexpr bool empty() const requires ranges::forward_range<const Derived>;
パラメーター
ありません。
戻り値
派生ビューに要素がない場合は、 true
を返します。 それ以外の場合、false
を返します。
解説
派生ビューは、 std::ranges::forward_range
を満たす必要があります。
front
派生ビューの最初の要素を取得します。
constexpr auto front()
requires ranges::forward_range<Derived>;
constexpr auto front() const
requires ranges::forward_range<const Derived>;
パラメーター
ありません。
戻り値
派生ビューの最後の要素。
解説
派生ビューは、 forward_range
を満たす必要があります。
front()
の動作は、std::ranges::empty_view
では定義されていません。
size
派生ビュー内の要素の数を取得します。
constexpr auto size() requires ranges::forward_range<Derived> &&
std::sized_sentinel_for<ranges::sentinel_t<Derived>,
ranges::iterator_t<Derived>>;
constexpr auto size() const requires ranges::forward_range<const Derived> &&
std::sized_sentinel_for<ranges::sentinel_t<const Derived>,
ranges::iterator_t<const Derived>>;
パラメーター
ありません。
戻り値
派生ビュー内の要素の数。
解説
派生ビューの反復子は、 sized_sentinel_for
を満たす必要があります。
operator[]
指定した位置にある要素を取得します。
template<ranges::random_access_range R = Derived>
constexpr decltype(auto) operator[](ranges::range_difference_t<R> pos);
template<ranges::random_access_range R = const Derived>
constexpr decltype(auto) operator[](ranges::range_difference_t<R> pos) const;
パラメーター
pos
返される要素の開始反復子を基準とした位置。
戻り値
開始反復子を基準にして指定した位置にある要素。
解説
派生ビューは、 random_access_range
を満たす必要があります。
この演算子の動作は、 std::ranges::empty_view
では定義されていません。
例: operator[]
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v{1, 2, 3, 4, 5};
std::ranges::drop_view dv = std::views::drop(v, 2);
for (auto e : dv)
{
std::cout << e << ' '; // 3 4 5
}
std::cout << "\ndv[1] = " << dv[1];
}
3 4 5
dv[1] = 4
view_interface::operator bool
派生ビューが空でないかどうかをテストします。
explicit constexpr operator bool();
explicit constexpr operator bool() const;
パラメーター
ありません。
戻り値
派生ビューに要素がない (ビューが空の) 場合は、 false
を返します。 それ以外の場合は、 true
を返します (ビューは空ではありません)。
解説
派生ビューの反復子は、 std::ranges::forward_iterator
を満たす必要があります。
この演算子は、 !empty()
と同じです。 これにより、操作する範囲に何かがあるかどうかをテストする if (someRange) {...}
を記述すると便利です。
この演算子の動作は、 std::ranges::empty_view
では定義されていません。
例: operator bool
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v{1, 2, 3, 4, 5};
std::ranges::filter_view fv = std::views::filter(v, [](int e) { return e > 3; });
bool isNotEmpty = static_cast<bool>(fv);
std::cout << "Has elements greater than 3: " << std::boolalpha << isNotEmpty << '\n' >>;
}
Has elements greater than 3: true
関連項目
<ranges>
ranges::begin()
ranges::data()
ranges::end()
ranges::empty()
ranges::size()
クラスの表示