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]