名前空間
変種
操作

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

From cppreference.com
< cpp‎ | ranges
 
 
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型の要件を指定します。
2) enable_view変数テンプレートは、rangeviewであるかどうかを示すために使用されます。/*is-derived-from-view-interface*/<T>は、Tが何らかの型Uに対してranges::view_interface<U>というパブリック基底クラスを正確に1つ持ち、かつTが他の型のranges::view_interface<V>の基底クラスを持たない場合にのみtrueとなります。
ユーザーは、viewをモデル化するcv修飾されていないプログラム定義の型についてはenable_viewtrueに特殊化し、そうでない型についてはfalseに特殊化することができます。このような特殊化は、定数式で使用可能である必要があり、型はconst boolである必要があります。
3) view_baseから派生することで、range型がviewをモデル化できるようになります。

目次

[編集] 意味的要件

1) Tviewをモデル化するのは、以下の場合に限ります。
  • Tのムーブ構築が定数時間計算量を持つこと、および
  • M個の要素を保持するTオブジェクトからN個のコピーおよび/またはムーブが作成された場合、これらの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つの特殊化から派生している場合にビューと見なされます。

[編集]

最小限のビュー。

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

[編集] 欠陥レポート

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

DR 適用対象 公開された動作 正しい動作
P2325R3 C++20 viewdefault_initializableを要求していた 要求しなくなった
LWG 3549 C++20 enable_viewview_interfaceからの継承を検出していなかった 検出するようになった
P2415R2 C++20 破棄の時間計算量に対する制約が厳しすぎた 緩和された
English 日本語 中文(简体) 中文(繁體)