名前空間
変種
操作

std::ranges::ref_view

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
ヘッダ <ranges> で定義
template< ranges::range R >

    requires std::is_object_v<R>
class ref_view

    : public ranges::view_interface<ref_view<R>>
(C++20以降)

ref_viewは、他のrangeの要素のviewです。それはそのrangeへの参照をラップします。

目次

[edit] データメンバー

メンバ名 定義
r_ (private) 基になる範囲へのR*型のポインタ。
(説明用のメンバオブジェクト*)

[edit] メンバー関数

指定された範囲を参照するref_viewを構築します。
(public member function)
参照されている範囲への参照を返します。
(public member function)
参照されている範囲の先頭イテレータを返します。
(public member function)
参照されている範囲のセンチネルを返します。
(public member function)
参照されている範囲が空かどうかを確認します。
(public member function)
参照されているsized_rangeのサイズを返します。
(public member function)
参照されているcontiguous_rangeの先頭へのポインタを返します。
(public member function)
std::ranges::view_interface から継承
(C++23)
範囲の先頭への定数イテレータを返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
(C++23)
範囲の定数イテレータの番兵を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが空でないかどうかを返す。ranges::empty が適用可能な場合にのみ提供される
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが forward_range を満たす場合に、派生ビューの最初の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが bidirectional_rangecommon_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]

std::ranges::ref_view::ref_view

template< /*different-from*/<ref_view> T >

    requires std::convertible_to<T, R&> && requires { _FUN(std::declval<T>()); }

constexpr ref_view( T&& t );
(C++20以降)

r_std::addressof(static_cast<R&>(std::forward<T>(t))) で初期化します。

/*different-from*/<T, U> は、std::remove_cvref_t<T>std::remove_cvref_t<U> が異なる型ではなく、_FUN のオーバーロードが void _FUN(R&); void _FUN(R&&) = delete; として宣言されている場合にのみ満たされます。

パラメータ

t - 範囲から参照へ

std::ranges::ref_view::base

constexpr R& base() const;
(C++20以降)

return *r_; に相当します。

std::ranges::ref_view::begin

constexpr ranges::iterator_t<R> begin() const;
(C++20以降)

return ranges::begin(*r_); に相当します。

std::ranges::ref_view::end

constexpr ranges::sentinel_t<R> end() const;
(C++20以降)

return ranges::end(*r_); に相当します。

std::ranges::ref_view::empty

constexpr bool empty() const
    requires requires { ranges::empty(*r_); };
(C++20以降)

return ranges::empty(*r_); に相当します。

std::ranges::ref_view::size

constexpr auto size() const
    requires ranges::sized_range<R>;
(C++20以降)

return ranges::size(*r_); に相当します。

std::ranges::ref_view::data

constexpr auto data() const
    requires ranges::contiguous_range<R>;
(C++20以降)

return ranges::data(*r_); に相当します。

[edit] 推論ガイド

template< class R >
ref_view( R& ) -> ref_view<R>;
(C++20以降)

[edit] ヘルパーテンプレート

template< class T >
constexpr bool enable_borrowed_range<ranges::ref_view<T>> = true;
(C++20以降)

std::ranges::enable_borrowed_range のこの特殊化により、ref_viewborrowed_range を満たすようになります。

[edit]

#include <iostream>
#include <ranges>
 
int main()
{
    const std::string s{"cosmos"};
 
    const std::ranges::take_view tv{s, 3};
    const std::ranges::ref_view rv{tv};
 
    std::cout
        << std::boolalpha
        << "call empty() : " << rv.empty() << '\n'
        << "call size()  : " << rv.size() << '\n'
        << "call begin() : " << *rv.begin() << '\n'
        << "call end()   : " << *(rv.end() - 1) << '\n'
        << "call data()  : " << rv.data() << '\n'
        << "call base()  : " << rv.base().size() << '\n' // ~> tv.size()
        << "range-for    : ";
 
    for (const auto c : rv)
        std::cout << c;
    std::cout << '\n';
}

出力

call empty() : false
call size()  : 3
call begin() : c
call end()   : s
call data()  : cosmos
call base()  : 3
range-for    : cos

[edit] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
P2325R3 C++20 デフォルトコンストラクタが view として提供されていました
default_initializable である必要があります
要件とともに削除されました

[edit] 関連項目

コピー構築可能 (CopyConstructible) かつ コピー代入可能 (CopyAssignable) な参照ラッパー
(クラステンプレート) [編集]
何らかのrangeの唯一の所有権を持つ view
(クラステンプレート) [編集]
rangeのすべての要素を含む view
(エイリアステンプレート) (rangeアダプタオブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)