Namespaces
Variants

std::ranges::elements_of

提供: ja.cppreference.net
 
 
範囲ライブラリ
範囲アダプタ
 
ヘッダで定義 <ranges>
template< ranges::range R, class Allocator = std::allocator<std::byte> >
struct elements_of;
(C++23以上)

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

テンプレートパラメータ

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

データメンバ

メンバー名 定義
range
型 R の範囲
(public member object)
allocator
型 Allocator のアロケータ。デフォルトメンバ初期化子を持ち、自身を値初期化する
(public member object)

これらのメンバーはすべて [[ 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の各要素をyield
    else
        co_yield r;                           // rを単一の値としてyield
}
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]