ラムダ式を使う

autoも普通に使えるし、C++を書いている感じじゃなかった。

#include <iostream>
#include <functional>

using namespace std;

int main() {
  auto make_counter = [](int n) -> std::function<int ()> {
    return [=]() -> int {
      // コピーによるキャプチャだとconstになるらしい
      int &i = const_cast<int&>(n);
      return i++;
    };
  };

  auto f1 = make_counter(10);
  auto f2 = make_counter(100);

  for (int i = 0; i < 3; i++) {
    cout << f1() << endl;
    cout << f2() << endl;
  }

  return 0;
}


10
100
11
101
12
102
続行するには何かキーを押してください . . .
コピーでキャプチャすると変数がconstになるらしい。キャストしてしまったけど問題がありそうな気がする…constにしない記法とかあるのかな?

追記

あ、mutableを使えばいいのか。

#include <iostream>
#include <functional>

using namespace std;

int main() {
  auto make_counter = [](int n) -> std::function<int ()> {
    return [n]() mutable -> int {
      return n++;
    };
  };

  auto f1 = make_counter(10);
  auto f2 = make_counter(100);

  for (int i = 0; i < 3; i++) {
    cout << f1() << endl;
    cout << f2() << endl;
  }

  return 0;
}