ダウンロード サンプルファイル (2.4 KB)
コルーチンベースで効率的なジェネレータ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やジェネレータ以外の標準ライブラリの機能強化について紹介します。
この記事は参考になりましたか?
既に会員の方はを行ってください。
- 【C++の新機能を理解する】最新バージョンを徹底解説!連載記事一覧
-
- C++の新機能を理解する――出力と部分シーケンス関連の機能強化
- C++の新機能を理解する――列挙型と状態チェック関連の機能強化
- C++の新機能を理解する──rangesライブラリとジェネレータ
- この記事の著者
-
WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
