質問編集履歴
4
引数を消してキャプチャのみにした
test
CHANGED
File without changes
|
test
CHANGED
@@ -118,7 +118,7 @@
|
|
118
118
|
|
119
119
|
some_class c(
|
120
120
|
|
121
|
-
[x](
|
121
|
+
[x](){ std::cout << x << std::endl; }
|
122
122
|
|
123
123
|
);
|
124
124
|
|
3
補足追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -3,6 +3,10 @@
|
|
3
3
|
|
4
4
|
|
5
5
|
例えば、クラス生成時にラムダ式を与えて、そのクラスが破棄されるときに呼ばれるようなものを作りたいと考えています。
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
また、あらゆる引数でも実行できるようにし、さらにコールバック関数が設定されていないことも考慮して、boost::none_t, std::function<void()>, std::function<void(int)>, ... という方に対応できる共用型にしようかと考えました。
|
6
10
|
|
7
11
|
|
8
12
|
|
2
文章に合ったコードに修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,4 +1,8 @@
|
|
1
|
-
クラスにラムダ式を与えて、そのクラス
|
1
|
+
クラスにラムダ式を与えて、そのクラス内でstd::functionとして保持し、コールバック関数として機能させるようなものを実装したいと思っています。
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
例えば、クラス生成時にラムダ式を与えて、そのクラスが破棄されるときに呼ばれるようなものを作りたいと考えています。
|
2
6
|
|
3
7
|
|
4
8
|
|
@@ -24,7 +28,9 @@
|
|
24
28
|
|
25
29
|
class some_class {
|
26
30
|
|
31
|
+
|
32
|
+
|
27
|
-
p
|
33
|
+
private:
|
28
34
|
|
29
35
|
using call_back_func_t = boost::variant<
|
30
36
|
|
@@ -35,6 +41,22 @@
|
|
35
41
|
std::function<void(int)>
|
36
42
|
|
37
43
|
>;
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
auto some_func() {
|
48
|
+
|
49
|
+
boost::apply_visitor(call_back_visitor(), call_back_);
|
50
|
+
|
51
|
+
}
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
call_back_func_t call_back_;
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
public:
|
38
60
|
|
39
61
|
|
40
62
|
|
@@ -50,21 +72,11 @@
|
|
50
72
|
|
51
73
|
|
52
74
|
|
53
|
-
|
75
|
+
some_class(call_back_func_t call_back): call_back_(call_back){}
|
54
76
|
|
55
|
-
|
77
|
+
~some_class(){ some_func(); }
|
56
|
-
|
57
|
-
}
|
58
78
|
|
59
79
|
|
60
|
-
|
61
|
-
some_class(call_back_func_t call_back): call_back_(call_back){}
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
private:
|
66
|
-
|
67
|
-
call_back_func_t call_back_;
|
68
80
|
|
69
81
|
|
70
82
|
|
@@ -73,6 +85,8 @@
|
|
73
85
|
|
74
86
|
|
75
87
|
int main() {
|
88
|
+
|
89
|
+
|
76
90
|
|
77
91
|
int x = 5;
|
78
92
|
|
@@ -84,17 +98,17 @@
|
|
84
98
|
|
85
99
|
);
|
86
100
|
|
87
|
-
a.some_func();
|
88
101
|
|
89
102
|
|
103
|
+
{
|
90
104
|
|
91
|
-
some_class b(
|
105
|
+
some_class b(
|
92
106
|
|
93
|
-
[]{ std::cout << "ok" << std::endl; }
|
107
|
+
[]{ std::cout << "ok" << std::endl; }
|
94
108
|
|
95
|
-
);
|
109
|
+
);
|
96
110
|
|
97
|
-
|
111
|
+
}
|
98
112
|
|
99
113
|
|
100
114
|
|
@@ -103,8 +117,6 @@
|
|
103
117
|
[x](int x){ std::cout << x << std::endl; }
|
104
118
|
|
105
119
|
);
|
106
|
-
|
107
|
-
c.some_func();
|
108
120
|
|
109
121
|
|
110
122
|
|
1
コード追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -50,15 +50,15 @@
|
|
50
50
|
|
51
51
|
|
52
52
|
|
53
|
-
some_class(call_back_func_t call_back): call_back_(call_back){}
|
54
|
-
|
55
|
-
|
56
|
-
|
57
53
|
auto some_func() {
|
58
54
|
|
59
55
|
boost::apply_visitor(call_back_visitor(), call_back_);
|
60
56
|
|
61
57
|
}
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
some_class(call_back_func_t call_back): call_back_(call_back){}
|
62
62
|
|
63
63
|
|
64
64
|
|
@@ -84,13 +84,17 @@
|
|
84
84
|
|
85
85
|
);
|
86
86
|
|
87
|
+
a.some_func();
|
88
|
+
|
87
89
|
|
88
90
|
|
89
91
|
some_class b(
|
90
92
|
|
91
|
-
[]{}
|
93
|
+
[]{ std::cout << "ok" << std::endl; }
|
92
94
|
|
93
95
|
);
|
96
|
+
|
97
|
+
b.some_func();
|
94
98
|
|
95
99
|
|
96
100
|
|
@@ -100,6 +104,22 @@
|
|
100
104
|
|
101
105
|
);
|
102
106
|
|
107
|
+
c.some_func();
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
/*
|
112
|
+
|
113
|
+
望まれる実行結果
|
114
|
+
|
115
|
+
./a.out
|
116
|
+
|
117
|
+
ok
|
118
|
+
|
119
|
+
5
|
120
|
+
|
121
|
+
*/
|
122
|
+
|
103
123
|
|
104
124
|
|
105
125
|
}
|