SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

Visual C++ 14で見つけた<experimental>(試験的)な機能

  • X ポスト
  • このエントリーをはてなブックマークに追加

std::experimental::generator

 もう一つ、<experimental/generator>にgeneratorという名のフシギなクラス・テンプレートが用意されています。これは近未来のC++に提案されているresumable functionsを実現するためのクラスです。

 コレを使うと「末尾の見えない集合」を簡単に扱うことができるようになります。というのも、C++にあらたなキーワード:yield が追加されるんです、ちょっとやってみましょう。

 初項a、公比rの等比数列を生成する関数:geometric_progression(a,r) を定義します。

 初項a、公比rの等比数列ですから、生成される数列はa, a*r, a*r*r, a*r*r*r ……ですが、この列に"末尾"はありません。つまりvector<double>などのコンテナを返すことができません。こんなシチュエーションでgeneratorとyieldの出番となります。

list06
#include <iostream>
#include <experimental/generator>

/*
 * 等比数列: a * r^n (n = 0, 1, 2...)
 */
template<typename T>
std::experimental::generator<T> geometric_progression(T a, T r) {
  // 無限ループで a, a*r, a*r*r, ... を yieldする
  while ( true ) {
    yield a;
    a *= r;
  }
}

int main() {
  using namespace std;
  // '一割増'を、元の2倍を超えるまで行う
  auto container = geometric_progression(1.0, 1.1);
  for ( auto iter = begin(container); iter != end(container); ++iter ) {
    cout << *iter << endl;
    if ( *iter > 2.0 ) break;
  }
}

 std::experimental::generator<T>は標準コンテナと同様に扱えるので、range-based forにも対応します:

list07
// '一割増'を、元の2倍を超えるまで行う
for ( auto item : geometric_progression(1.0, 1.1) ) {
  cout << item << endl;
  if ( item > 2.0 ) break;
}

 yieldは近未来のキーワードで、コンパイル時に/awaitオプションつけないとコンパイラに怒られるのでご注意を。

次のページ
std::chrono::xxx_clockの分解能

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

επιστημη(エピステーメー)

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/9084 2015/11/30 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング