Namespaces
Variants

std::ranges::elements_of

De es.cppreference.net
 
 
Biblioteca de rangos
Adaptadores de rangos
 
Definido en el encabezado <ranges>
template< ranges::range R, class Allocator = std::allocator<std::byte> >
struct elements_of;
(desde C++23)

Encapsula un rango. Las especializaciones de elements_of actúan como una etiqueta en conjuntos de sobrecarga para desambiguar cuando un rango debe ser tratado como una secuencia en lugar de un valor único.

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]