最終更新日時(UTC):
が更新

履歴 編集

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の要素を順次生成することを示すタグ型。

テンプレートパラメータ制約

テンプレートパラメータRrangeコンセプトを満たすこと。

メンバ変数

名前 説明 対応バージョン
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

処理系

関連項目

参照