最終更新日時(UTC): 2022年12月30日 15時42分53秒
yoh が更新

履歴 編集

class template
<ranges>

# std::ranges::elements_of(C++23)

    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++:

## 関連項目

- `<generator>`

## 参照

- P2502R2 `std::generator`: Synchronous Coroutine Generator for Ranges