std::ranges::view, std::ranges::enable_view, std::ranges::view_base
| Défini dans l'en-tête <ranges>
|
||
template<class T>
concept view = ranges::range<T> && std::movable<T> && ranges::enable_view<T>;
|
(1) | (depuis C++20) |
template<class T>
constexpr bool enable_view =
std::derived_from<T, view_base> || /*is-derived-from-view-interface*/<T>;
|
(2) | (depuis C++20) |
struct view_base { };
|
(3) | (depuis C++20) |
view spécifie les exigences d'un type range qui possède des propriétés sémantiques appropriées pour être utilisé dans la construction de pipelines d'adaptateurs de range.enable_view est utilisé pour indiquer si un range est une view. /*is-derived-from-view-interface*/<T> est true si et seulement si T a exactement une classe de base publique ranges::view_interface<U> pour un certain type U, et T n'a aucune classe de base de type ranges::view_interface<V> pour tout autre type V.
Les utilisateurs peuvent spécialiser enable_view en true pour les types définis par le programme non qualifiés cv qui modélisent view, et false pour les types qui ne le font pas. Ces spécialisations doivent être utilisables dans des expressions constantes et avoir le type const bool.
Exigences sémantiques
T
modélise
view
seulement si :
-
la construction par déplacement de
Ta une complexité temporelle constante, et -
si
N
copies et/ou déplacements sont effectués à partir d'un objet
Tcontenant M éléments, alors ces N objets ont 𝓞(N+M) destruction (ce qui implique qu'un objetviewdéplacé a 𝓞(1) destruction), et -
soit
std::
copy_constructible
<
T
>
est
false
, soit la construction par copie de
Ta une complexité temporelle constante, et -
soit
std::
copyable
<
T
>
est
false
, soit l'affectation par copie de
Tn'a pas une complexité temporelle supérieure à une destruction suivie d'une construction par copie.
Spécialisations
Les spécialisations de
enable_view
pour toutes les spécialisations des modèles standards suivants sont définies comme
true
:
| (depuis C++26) |
Notes
Exemples de types de
view
sont :
-
Un type de
rangequi encapsule une paire d'itérateurs, par exemple, std :: ranges:: subrange < I > . -
Un type de
rangequi détient ses éléments via std::shared_ptr et partage la propriété avec toutes ses copies. -
Un type de
rangequi génère ses éléments à la demande, par exemple, std::ranges::iota_view .
Un conteneur copiable tel que
std::
vector
<
std::
string
>
ne satisfait généralement pas aux exigences sémantiques d'une
view
puisque copier le conteneur copie tous les éléments, ce qui ne peut être fait en temps constant.
Bien que les vues aient été initialement décrites comme des gammes non propriétaires et peu coûteuses à copier, un type n'est pas obligé d'être copiable ou non propriétaire pour modéliser
view
. Cependant, il doit rester peu coûteux à copier (s'il est copiable), déplacer, assigner et détruire, afin que
range adaptors
n'aient pas une complexité inattendue.
Par défaut, un type modélisant
movable
et
range
est considéré comme une vue s'il est dérivé publiquement et sans ambiguïté de
view_base
, ou d'exactement une spécialisation de
std::ranges::view_interface
.
Exemple
Une vue minimale.
#include <ranges> struct ArchetypalView : std::ranges::view_interface<ArchetypalView> { int* begin(); int* end(); }; static_assert(std::ranges::view<ArchetypalView>);
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| P2325R3 | C++20 |
view
nécessitait
default_initializable
|
ne nécessite pas |
| LWG 3549 | C++20 |
enable_view
ne détectait pas l'héritage de
view_interface
|
détecte |
| P2415R2 | C++20 | la restriction sur la complexité temporelle de la destruction était trop stricte | assouplie |