Namespaces
Variants

std::ranges::elements_of

De fr.cppreference.net
 
 
Bibliothèque de plages
Adaptateurs de plages
 
Défini dans l'en-tête <ranges>
template< ranges::range R, class Allocator = std::allocator<std::byte> >
struct elements_of;
(depuis C++23)

Encapsule une plage. Les spécialisations de elements_of agissent comme un tag dans les ensembles de surcharge pour désambiguïser lorsqu'une plage doit être traitée comme une séquence plutôt que comme une valeur unique.

Paramètres du modèle

R - un type qui satisfait range
Allocator - un type d'allocateur qui répond aux exigences de Allocator

Membres de données

Nombre du membre Définition
range
une plage de type R
(objet membre public)
allocator
un allocateur de type Allocator . Il possède un initialiseur de membre par défaut qui s'initialise par valeur
(objet membre public)

Tous ces membres sont déclarés avec l'attribut [[ no_unique_address ]] .

Guide de déduction

template < class R, class Allocator = std:: allocator < std:: byte > >
elements_of ( R && , Allocator = Allocator ( ) ) - > elements_of < R && , Allocator > ;
(depuis C++23)
Seul le texte "since C++23" a été traduit en "depuis C++23" car c'est la seule partie textuelle non technique et non contenue dans des balises ` `. Tous les termes C++ spécifiques, le code et les balises HTML ont été préservés intacts.

Exemple

#include <any>
#include <generator>
#include <iostream>
#include <ranges>
#include <string_view>
template<bool Elementwise>
std::generator<std::any> gen(std::ranges::input_range auto&& r)
{
    if constexpr (Elementwise)
        co_yield std::ranges::elements_of(r); // produire chaque élément de r
    else
        co_yield r;                           // produire r comme une valeur unique
}
int main()
{
    auto test = std::string_view{"test"};
    for (std::any a : gen<true>(test))
        std::cout << '[' << std::any_cast<char>(a) << "] ";
    std::cout << '\n';
    for (std::any a : gen<false>(test))
        std::cout << '[' << std::any_cast<std::string_view>(a) << "] ";
    std::cout << '\n';
}

Sortie :

[t] [e] [s] [t] 
[test]

Références

  • Norme C++23 (ISO/IEC 14882:2024) :
  • 26.5.6 Modèle de classe elements_of [range.elementsof]