Namespaces
Variants

std::ranges:: elements_of

From cppreference.net
Ranges library
Range adaptors
Definiert im Header <ranges>
template < ranges:: range R, class Allocator = std:: allocator < std:: byte > >
struct elements_of ;
(seit C++23)

Kapselt einen range . Spezialisierungen von elements_of dienen als Markierung in Überladungsmengen, um zu unterscheiden, wann ein Bereich als Sequenz statt als einzelner Wert behandelt werden soll.

Inhaltsverzeichnis

Template-Parameter

R - ein Typ, der die Anforderungen von range erfüllt
Allocator - ein Allokatortyp, der die Anforderungen von Allocator erfüllt

Datenmitglieder

Mitgliedername Definition
range
ein Bereich vom Typ R
(öffentliches Mitgliedsobjekt)
allocator
ein Allokator vom Typ Allocator . Besitzt einen Standard-Member-Initialisierer, der sich selbst wertinitialisiert
(öffentliches Mitgliedsobjekt)

Alle diese Member sind mit dem [[ no_unique_address ]] -Attribut deklariert.

Deduktionsanleitung

template < class R, class Allocator = std:: allocator < std:: byte > >
elements_of ( R && , Allocator = Allocator ( ) ) - > elements_of < R && , Allocator > ;
(seit C++23)

Beispiel

#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); // jedes Element von r ausgeben
    else
        co_yield r;                           // r als einzelnen Wert ausgeben
}
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';
}

Ausgabe:

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

Referenzen

  • C++23-Standard (ISO/IEC 14882:2024):
  • 26.5.6 Klassentemplate elements_of [range.elementsof]