Namespaces
Variants

std::ranges:: elements_of

From cppreference.net
Ranges library
Range adaptors
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 un range . Les spécialisations de elements_of agissent comme un marqueur dans les ensembles de surcharge pour lever l'ambiguïté lorsqu'une plage doit être traitée comme une séquence plutôt que comme une valeur unique.

Table des matières

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]