次の方法で共有


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
この基底クラスから派生するクラスの型。

メンバー

メンバー関数 説明
backC++20 派生ビューの最後の要素を取得します。
dataC++20 派生ビューの最初の要素へのポインターを取得します。
emptyC++20 派生ビューが空かどうかをテストします。
frontC++20 派生ビューの最初の要素を取得します。
sizeC++20 派生ビュー内の要素の数を取得します。
オペレーター 説明
operator[]C++20 指定した位置にある要素を取得します。
operator boolC++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_rangecommon_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()
クラスの表示