名前空間
変種
操作

std::ranges::elements_of

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
ヘッダ <ranges> で定義
template< ranges::range R, class Allocator = std::allocator<std::byte> >
struct elements_of;
(C++23から)

range をカプセル化します。elements_of の特殊化は、オーバーロードセット内でタグとして機能し、範囲が単一の値としてではなくシーケンスとして扱われるべき場合を曖昧にします。

目次

[編集] テンプレートパラメータ

R - range を満たす型
アロケータ - Allocator の要件を満たすアロケータ型

[編集] データメンバ

メンバ名 定義
range
R の範囲
(public メンバーオブジェクト)
allocator
Allocator のアロケータ。デフォルトメンバ初期化子を持ち、自身を値初期化します。
(public メンバーオブジェクト)

これらのメンバーはすべて[[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); // 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]
English 日本語 中文(简体) 中文(繁體)