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