std::ranges::elements_of
Определён в заголовочном файле <ranges> | ||
|---|---|---|
template< ranges::range R, class Allocator = std::allocator<std::byte> > struct elements_of; | (начиная с C++23) |
Инкапсулирует range. Специализации elements_of выступают в качестве тега в наборах перегрузок, позволяя однозначно определить, следует ли трактовать диапазон как последовательность, а не как отдельное значение.
Параметры шаблона
| R | - | тип, удовлетворяющий требованиям range |
| Allocator | - | тип аллокатора, отвечающий требованиям Allocator |
Поля данных
| Поле | Описание |
|---|---|
[[no_unique_address]] R range | диапазон (публичный нестатический член-объект) |
[[no_unique_address]] Allocator allocator | аллокатор. Имеет инициализатор члена по умолчанию, который выполняет инициализацию значением (публичный нестатический член-объект) |
Руководство по выводу аргументов шаблона
template< class R, class Allocator = std::allocator<std::byte> > elements_of( R&&, Allocator = Allocator() ) -> elements_of<R&&, Allocator>; | (начиная с C++23) |
Пример
#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';
}
Вывод:
[t] [e] [s] [t] [test]
Ссылки
- Стандарт C++23 (ISO/IEC 14882:2024):
- 26.5.6 Шаблон класса elements_of [range.elementsof]
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/elements_of