std::ranges::view, std::ranges::enable_view, std::ranges::view_base
From cppreference.com
| ヘッダ <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 = |
(2) | (C++20以降) |
| struct view_base { }; |
(3) | (C++20以降) |
2)
ユーザーは、
enable_view変数テンプレートは、rangeがviewであるかどうかを示すために使用されます。/*is-derived-from-view-interface*/<T>は、Tが何らかの型Uに対してranges::view_interface<U>というパブリック基底クラスを正確に1つ持ち、かつTが他の型のranges::view_interface<V>の基底クラスを持たない場合にのみtrueとなります。ユーザーは、
viewをモデル化するcv修飾されていないプログラム定義の型についてはenable_viewをtrueに特殊化し、そうでない型についてはfalseに特殊化することができます。このような特殊化は、定数式で使用可能である必要があり、型はconst boolである必要があります。目次 |
[編集] 意味的要件
1)
Tがviewをモデル化するのは、以下の場合に限ります。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型の例としては、以下のようなものがあります。
- イテレータのペアをラップする
range型。例えば、std::ranges::subrange<I>。 - 要素をstd::shared_ptrで保持し、すべてのコピーと所有権を共有する
range型。 - 要素をオンデマンドで生成する
range型。例えば、std::ranges::iota_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 | viewはdefault_initializableを要求していた |
要求しなくなった |
| LWG 3549 | C++20 | enable_viewはview_interfaceからの継承を検出していなかった |
検出するようになった |
| P2415R2 | C++20 | 破棄の時間計算量に対する制約が厳しすぎた | 緩和された |