Namensräume
Varianten
Aktionen

std::ranges::elements_of

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
 
Definiert in der Header-Datei <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 Tag in Überladungs-Sets, um zu unterscheiden, wann ein Bereich als Sequenz und nicht als einzelner Wert behandelt werden soll.

Inhalt

[bearbeiten] Template-Parameter

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

[bearbeiten] Datenmember

Member-Name Definition
range
ein Bereich vom Typ R
(öffentliches Mitgliedsobjekt)
allocator
ein Allokator vom Typ Allocator. Er hat eine Standard-Member-Initialisierung, die sich selbst wertinitialisiert
(öffentliches Mitgliedsobjekt)

Alle diese Member werden mit dem Attribut [[no_unique_address]] deklariert.

[bearbeiten] Deduktionshilfe

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

[bearbeiten] 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); // yield each element of r
    else
        co_yield r;                           // yield r as a single value
}
 
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]

[bearbeiten] Referenzen

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