std::ranges:: view_interface
|
Défini dans l'en-tête
<ranges>
|
||
|
template
<
class
D
>
requires
std::
is_class_v
<
D
>
&&
std::
same_as
<
D,
std::
remove_cv_t
<
D
>>
|
(depuis C++20) | |
std::ranges::view_interface
est une classe template d'aide pour définir une interface de vue.
view_interface
est généralement utilisé avec
CRTP
:
class my_view : public std::ranges::view_interface<my_view> { public: auto begin() const { /*...*/ } auto end() const { /*...*/ } // empty() est fournie si begin() retourne un itérateur avant // et end() retourne un sentinelle pour celui-ci. };
Table des matières |
Fonctions membres
renvoie si la vue dérivée est vide, fourni uniquement si elle satisfait
sized_range
ou
forward_range
(fonction membre publique) |
|
|
(C++23)
|
renvoie un itérateur constant vers le début de la plage
(fonction membre publique) |
|
(C++23)
|
renvoie un sentinelle pour l'itérateur constant de la plage
(fonction membre publique) |
|
renvoie si la vue dérivée n'est pas vide, fourni uniquement si
ranges::empty
lui est applicable
(fonction membre publique) |
|
obtient l'adresse des données de la vue dérivée, fourni uniquement si son type d'itérateur satisfait
contiguous_iterator
(fonction membre publique) |
|
renvoie le nombre d'éléments dans la vue dérivée. Fourni si elle satisfait
forward_range
et que son type de sentinelle et d'itérateur satisfont
sized_sentinel_for
.
(fonction membre publique) |
|
renvoie le premier élément de la vue dérivée, fourni si elle satisfait
forward_range
(fonction membre publique) |
|
renvoie le dernier élément de la vue dérivée, fourni uniquement si elle satisfait
bidirectional_range
et
common_range
(fonction membre publique) |
|
renvoie le
n
ème
élément de la vue dérivée, fourni uniquement si elle satisfait
random_access_range
(fonction membre publique) |
Exemple
#include <iostream> #include <ranges> #include <vector> template<class T, class A> class VectorView : public std::ranges::view_interface<VectorView<T, A>> { public: VectorView() = default; VectorView(const std::vector<T, A>& vec) : m_begin(vec.cbegin()), m_end(vec.cend()) {} auto begin() const { return m_begin; } auto end() const { return m_end; } private: typename std::vector<T, A>::const_iterator m_begin{}, m_end{}; }; int main() { std::vector<int> v = {1, 4, 9, 16}; VectorView view_over_v{v}; // Nous pouvons itérer avec begin() et end(). for (int n : view_over_v) std::cout << n << ' '; std::cout << '\n'; // Nous obtenons operator[] gratuitement en héritant de view_interface // puisque nous satisfaisons le concept random_access_range. for (std::ptrdiff_t i = 0; i != view_over_v.size(); ++i) std::cout << "v[" << i << "] = " << view_over_v[i] << '\n'; }
Sortie :
1 4 9 16 v[0] = 1 v[1] = 4 v[2] = 9 v[3] = 16
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 | Applicable à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 3549 | C++20 |
view_interface
devait être dérivé de
view_base
,
ce qui nécessitait parfois plusieurs sous-objets
view_base
dans une vue
|
héritage supprimé |
Voir aussi
|
(C++20)
|
combine une paire itérateur-sentinelle en une
view
(modèle de classe) |