質問編集履歴

4

引数を消してキャプチャのみにした

2015/10/08 11:09

投稿

taratail
taratail

スコア76

test CHANGED
File without changes
test CHANGED
@@ -118,7 +118,7 @@
118
118
 
119
119
  some_class c(
120
120
 
121
- [x](int x){ std::cout << x << std::endl; }
121
+ [x](){ std::cout << x << std::endl; }
122
122
 
123
123
  );
124
124
 

3

補足追記

2015/10/08 11:09

投稿

taratail
taratail

スコア76

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

文章に合ったコードに修正

2015/10/08 08:20

投稿

taratail
taratail

スコア76

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
- public:
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
- auto some_func() {
75
+ some_class(call_back_func_t call_back): call_back_(call_back){}
54
76
 
55
- boost::apply_visitor(call_back_visitor(), call_back_);
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
- b.some_func();
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

コード追記

2015/10/08 08:09

投稿

taratail
taratail

スコア76

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
  }