Namespaces
Variants

std::ranges:: elements_of

From cppreference.net
Ranges library
Range adaptors
Definido en el encabezado <ranges>
template < ranges:: range R, class Allocator = std:: allocator < std:: byte > >
struct elements_of ;
(desde C++23)

Encapsula un range . Las especializaciones de elements_of actúan como una etiqueta en conjuntos de sobrecarga para eliminar la ambigüedad cuando un rango debe tratarse como una secuencia en lugar de un valor único.

Contenidos

Parámetros de plantilla

R - un tipo que satisface range
Allocator - un tipo de asignador que cumple con los requisitos de Allocator

Miembros de datos

Nombre del miembro Definición
range
un rango de tipo R
(objeto miembro público)
allocator
un asignador de tipo Allocator . Tiene un inicializador de miembro predeterminado que se inicializa por valor a sí mismo
(objeto miembro público)

Todos estos miembros están declarados con el [[ no_unique_address ]] atributo.

Guía de deducción

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

Ejemplo

#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); // producir cada elemento de r
    else
        co_yield r;                           // producir r como un único valor
}
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';
}

Salida:

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

Referencias

  • Estándar C++23 (ISO/IEC 14882:2024):
  • 26.5.6 Plantilla de clase elements_of [range.elementsof]