最終更新日時(UTC):
が更新

履歴 編集

class template
<ranges>

std::ranges::ref_view(C++20)

namespace std::ranges {
  template<range R>
    requires is_object_v<R>
  class ref_view : public view_interface<ref_view<R>> { …… };
}

概要

Rangeへの参照として振る舞うview。このクラスのオブジェクトは、Rangeアダプタallによって生成される。

Rangeコンセプト

borrowed sized output input forward bidirectional random_access contiguous common viewable view

※ 参照先のRangeに従う

メンバ関数

名前 説明 対応バージョン
(constructor) コンストラクタ C++20
base Rの参照を取得する C++20
begin 先頭を指すイテレータを取得する C++20
end 番兵を取得する C++20
empty Rangeが空かどうかを判定する C++20
size 要素数を取得する C++20
data Rangeの先頭へのポインタを取得する C++20

rを参照先のRangeとする。emptysizedataは、それぞれranges::empty(r)ranges::size(r)ranges::data(r)が有効な式であるときに定義される。

継承しているメンバ関数

名前 説明 対応バージョン
operator bool Rangeが空でないかどうかを判定する C++20
front 先頭要素への参照を取得する C++20
back 末尾要素への参照を取得する C++20
operator[] 要素へアクセスする C++20
cbegin 定数イテレータを取得する C++23
cend 定数イテレータ(番兵)を取得する C++23

推論補助

名前 説明 対応バージョン
(deduction_guide) クラステンプレートの推論補助 C++20

#include <ranges>
#include <iostream>

int main() {
  using namespace std;
  int a[] = {1, 2, 3, 4, 5};

  for (int i : a | views::all) {
    cout << i;
  }
}

出力

12345

実装例

namespace std::ranges {
  template<class T, class U>
  concept __different_from = !same_as<remove_cvref_t<T>, remove_cvref_t<U>>;

  void __FUN(R&);
  void __FUN(R&&) = delete;

  template<range R>
    requires is_object_v<R>
  class ref_view : public view_interface<ref_view<R>> {
  private:
    R* r_;
  public:
    template<__different_from<ref_view> T>
      requires convertible_to<T, R&> && requires { __FUN(declval<T>()); }
    constexpr ref_view(T&& t) : r_(addressof(static_cast<R&>(std::forward<T>(t)))) {}

    constexpr R& base() const { return *r_; }

    constexpr iterator_t<R> begin() const {
      return ranges::begin(*r_);
    }

    constexpr sentinel_t<R> end() const {
      return ranges::end(*r_);
    }

    constexpr bool empty() const requires requires { ranges::empty(*r_); } {
      return ranges::empty(*r_);
    }

    constexpr auto size() const requires sized_range<R> {
      return ranges::size(*r_);
    }

    constexpr auto data() const requires contiguous_range<R> {
      return ranges::data(*r_);
    }
  };

  template<class R>
  ref_view(R&) -> ref_view<R>;
}

バージョン

言語

  • C++20

処理系

参照