回答編集履歴
1
関数生成の分離
answer
CHANGED
@@ -32,4 +32,48 @@
|
|
32
32
|
}
|
33
33
|
```
|
34
34
|
|
35
|
-
ちなみにC++はど素人です。さっき勉強しました。スタックやリストに関数を格納するのは他の言語ですでに経験済み。
|
35
|
+
ちなみにC++はど素人です。さっき勉強しました。スタックやリストに関数を格納するのは他の言語ですでに経験済み。
|
36
|
+
|
37
|
+
**関数生成の分離**
|
38
|
+
|
39
|
+
関数生成を分離しました。クロージャによって必要なオブジェクトが関数に取り込まれているので関数はどこで実行してもよいことになります。
|
40
|
+
|
41
|
+
```cpp
|
42
|
+
#include <iostream>
|
43
|
+
#include <functional>
|
44
|
+
#include <stack>
|
45
|
+
|
46
|
+
std::function<int()> val(int v) {
|
47
|
+
return [v]() {return v;};
|
48
|
+
}
|
49
|
+
|
50
|
+
std::function<int()> mult(std::stack<std::function<int()>> *s) {
|
51
|
+
return [s]() mutable {
|
52
|
+
auto x = s->top()();
|
53
|
+
s->pop();
|
54
|
+
auto y = s->top()();
|
55
|
+
s->pop();
|
56
|
+
auto result = x * y;
|
57
|
+
s->push(val(result));
|
58
|
+
return result;
|
59
|
+
};
|
60
|
+
}
|
61
|
+
|
62
|
+
int main() {
|
63
|
+
|
64
|
+
std::stack<std::function<int()>> s;
|
65
|
+
s.push(val(3));
|
66
|
+
s.push(val(5));
|
67
|
+
s.push(mult(&s));
|
68
|
+
|
69
|
+
std::function<int()> f = s.top();
|
70
|
+
s.pop();
|
71
|
+
f(); // claculation
|
72
|
+
std::cout << "3 5 * : " << s.top()() << std::endl;
|
73
|
+
|
74
|
+
return 0;
|
75
|
+
|
76
|
+
}
|
77
|
+
|
78
|
+
コード
|
79
|
+
```
|