std::ranges::elements_of
From cppreference.com
| ヘッダ <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]