namespace std::ranges {
template<range R, class Allocator = allocator<byte>>
struct elements_of {
[[no_unique_address]] R range;
[[no_unique_address]] Allocator allocator = Allocator();
};
template<class R, class Allocator = allocator<byte>>
elements_of(R&&, Allocator = Allocator()) -> elements_of<R&&, Allocator>;
}
概要
ジェネレータstd::generator
を戻り値型とするコルーチンにおいて、co_yield
式がネストしたRangeの要素を順次生成することを示すタグ型。
テンプレートパラメータ制約
テンプレートパラメータR
はrange
コンセプトを満たすこと。
メンバ変数
名前 | 説明 | 対応バージョン |
---|---|---|
range |
Range | C++23 |
allocator |
Allocator | C++23 |
例
#include <generator>
#include <iostream>
#include <ranges>
#include <vector>
std::vector<int> vec{2, 3, 4};
// int値を生成するジェネーレタ・コルーチン
std::generator<int> func()
{
// 値1を生成する
co_yield 1;
// vecの要素を1個づつ生成する
co_yield std::ranges::elements_of(vec);
// co_yield vec;では「std::vector<int>型の値を生成」の意味になり、
// 戻り値型=int型ジェネレータに適合しないためコンパイルエラーとなる。
// 値5を生成する
co_yield 5;
}
int main()
{
// ジェネレータを生成する
std::generator<int> gen = func();
// この時点ではコルーチンfuncはサスペンド状態にある
// ジェネレータにより生成されるRange要素を列挙する
for (int n : gen) {
std::cout << n << std::endl;
}
}
出力
1
2
3
4
5
バージョン
言語
- C++23
処理系
- Clang:
- GCC:
- ICC:
- Visual C++: