しつこくラムダ式を使う

↓のようなことしようとした。

function make_counter(n) {
  f = function() {
    return n++;
  };

  g = function() {
    return n++;
  }
}

make_counter(100);
print(f()); // 100
print(g()); // 101

ローカル変数を参照でキャプチャするのはさすがに不味そうなので、shared_ptrを使う。

#include <iostream>
#include <functional>
#include <memory>

using namespace std;

int main() {
  auto make_shared_counter = [](int n) -> function<function<int ()> ()> {
    auto i = shared_ptr<int>(new int(n));

    return [=]() mutable -> function<int ()> {
      auto j = i;

      return [=]() mutable -> int {
        return (*j)++;
      };
    };
  };

  auto maker = make_shared_counter(100);
  auto f1 = maker();
  auto f2 = maker();

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

  return 0;
}


100
101
102
103
104
105
続行するには何かキーを押してください . . .

関数オブジェクトをグローバル化するのがめんどくさかったから、コードがややこしくなった。あと「return (*i)++;」はダメらしい。