std::ranges::elements_of

来自cppreference.com
< cpp‎ | ranges
 
 
范围库
范围适配器
 
在标头 <ranges> 定义
template< ranges::range R, class Allocator = std::allocator<std::byte> >
struct elements_of;
(C++23 起)

封装一个 rangeelements_of 的特化在重载集中作为标签,用以区分一个范围应当被视为序列而非单个值的情况。

模板形参

R - 满足 range 的类型
Allocator - 满足分配器 (Allocator) 规定的分配器类型

数据成员

成员名字 定义
range
R 类型的范围
(公开成员对象)
allocator
Allocator 类型的分配器。它带有为其自身进行值初始化的默认成员初始化式。
(公开成员对象)

所有这些成员都被声明为带有 [[no_unique_address]] 属性。

推导指引

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); // 产出 r 的每个元素
    else
        co_yield r;                           // 产出 r 作为单个值
}
 
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 Class template elements_of [range.elementsof]