コルーチンベースで効率的なジェネレータstd::generator[C++ 23]
C++ 23では、コルーチンベースのジェネレータstd::generatorが使えるようになりました。
C++23で導入されたstd::generatorは、コルーチン機能を活用して、値を順次生成・返却するジェネレータです。これにより、関数の途中で一時停止し、必要なタイミングで値の生成を再開することが可能になります。
std::generatorはco_yieldキーワードを用いて、値を一つずつ外部に返すことができます。これにより、関数の状態を保持したまま、効率的に次の値を生成し続けることが可能です。これは無限列や遅延評価が必要なシーケンスの生成などに特に有効です。
[NOTE]コルーチン
コルーチンはC++ 20で導入された機能で、プログラムの実行を一時停止し、後で再開できる特殊な関数です。co_await、co_yield、co_returnといったキーワードを使用し、非同期処理や逐次的なデータ生成などをシンプルに表現できます。
ジェネレータは、generator<T>から生成されるクラスです。以下のリストは、1から引数n - 1までの値を生成するジェネレータの例です。
#include <generator> // generator<T>に必要
#include <iostream>
…略…
// 1からnの値を返すジェネレータ
generator<int> count_up_to(int n) {
for (int i = 0; i < n; i++) {
co_yield i; // 値を呼び出し元に返す
}
}
int main() {
// ジェネレータは範囲for文で使える
for (int value : count_up_to(10)) {
cout << value << " " << endl;
}
return 0;
}
count_up_to関数はco_yieldを使って値を返し、main関数内の範囲for文でその値を順次受け取っています。
まとめ
今回は、C++ 23における関数面の強化点を、rangesライブラリとジェネレータstd::generatorを中心に紹介しました。次回は、rangesやジェネレータ以外の標準ライブラリの機能強化について紹介します。
