Namespaces
Variants

std::ranges::view, std::ranges::enable_view, std::ranges::view_base

ja.cppreference.net より
 
 
Ranges ライブラリ
Range アダプタ
 
ヘッダ <ranges>
template<class T>
concept view = ranges::range<T> && std::movable<T> && ranges::enable_view<T>;
で定義 (1) (C++20 以降)
template<class T>
constexpr bool enable_view =
    std::derived_from<T, view_base> || /*is-derived-from-view-interface*/<T>;
(2) (C++20 以降)
struct view_base { };
(3) (C++20 以降)
1) コンセプト view は、range 型が range アダプタパイプラインで使用するのに適した意味論的特性を持つための要件を指定します。
2) 変数テンプレート enable_view は、rangeview であるかどうかを示すために使用されます。 /*is-derived-from-view-interface*/<T> は、true が以下を満たす場合に限り T となります。すなわち、ある型 ranges::view_interface<U> に対して U がちょうど1つのパブリック基底クラス T を持ち、なおかつ他の任意の型 ranges::view_interface<V> に対して V が型


の基底クラスを持たない場合です。 enable_viewユーザーは、true をモデル化する cv 修飾されていないプログラム定義型に対して view を、モデル化しない型に対しては false を特殊化できます。そのような特殊化は 定数式で使用可能 であり、型 const bool を持たなければなりません。

3) view_base から派生することで、range 型が view をモデル化できるようになります。

セマンティック要件

1) T view をモデル化するのは、以下の場合に限る:
  • T のムーブ構築が定数時間計算量を持つこと、および
  • N 個のコピーおよび/またはムーブが M 個の要素を保持する T オブジェクトから作成された場合、これらの N 個のオブジェクトの破棄が 𝓞(N+M) となること(これはムーブされた view オブジェクトの破棄が 𝓞(1) であることを意味する)、および
  • std:: copy_constructible < T > false であるか、または T のコピー構築が定数時間計算量を持つこと、および
  • std:: copyable < T > false であるか、または T のコピー代入の時間計算量が破棄後にコピー構築を行う場合を超えないこと。

特殊化

以下の標準テンプレートのすべての特殊化に対する enable_view の特殊化は true として定義されます:

(C++26以降)

注記

view型の例としては:

コピー可能なコンテナ、例えば std:: vector < std:: string > は一般に view の意味論的要件を満たしません。なぜならコンテナのコピーはすべての要素をコピーするため、定数時間で実行することができないからです。

ビューは元々、低コストでコピー可能かつ非所有の範囲として記述されていましたが、型がviewをモデル化するためにコピー可能または非所有である必要はありません。ただし、それでもコピー(コピー可能な場合)、ムーブ、代入、破棄が低コストでなければならず、そうすることでレンジアダプタが予期しない計算量を持たないようにします。

デフォルトでは、 movable range をモデリングする型は、 view_base から公開かつ明確に派生している場合、または std::ranges::view_interface の特殊化がちょうど1つある場合、viewと見なされます。

最小ビュー。

#include <ranges>
struct ArchetypalView : std::ranges::view_interface<ArchetypalView>
{
    int* begin();
    int* end();
};
static_assert(std::ranges::view<ArchetypalView>);

欠陥報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
P2325R3 C++20 view default_initializable を要求していた 要求しない
LWG 3549 C++20 enable_view view_interface からの継承を検出しなかった 検出する
P2415R2 C++20 破棄の時間計算量に関する制限が厳しすぎた 緩和された