↓のようなことしようとした。
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)++;
」はダメらしい。