- ranges[meta header]
- class template[meta id-type]
- std::ranges[meta namespace]
- cpp23[meta cpp]
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>;
}
- allocator[link /reference/memory/allocator.md]
ジェネレータ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;
}
}
- std::ranges::elements_of[color ff0000]
- std::generator[link /reference/generator/generator.md]
- co_yield[link /lang/cpp20/coroutines.md]
1
2
3
4
5
- C++23
- Clang:
- GCC:
- ICC:
- Visual C++: