質問編集履歴
4
引数を消してキャプチャのみにした
title
CHANGED
File without changes
|
body
CHANGED
@@ -58,7 +58,7 @@
|
|
58
58
|
}
|
59
59
|
|
60
60
|
some_class c(
|
61
|
-
[x](
|
61
|
+
[x](){ std::cout << x << std::endl; }
|
62
62
|
);
|
63
63
|
|
64
64
|
/*
|
3
補足追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
例えば、クラス生成時にラムダ式を与えて、そのクラスが破棄されるときに呼ばれるようなものを作りたいと考えています。
|
4
4
|
|
5
|
+
また、あらゆる引数でも実行できるようにし、さらにコールバック関数が設定されていないことも考慮して、boost::none_t, std::function<void()>, std::function<void(int)>, ... という方に対応できる共用型にしようかと考えました。
|
6
|
+
|
5
7
|
具体的には以下の様なイメージのコードが成立するようにしたいです(実際はコンパイルエラーを起こします)。
|
6
8
|
|
7
9
|
どのように書くべきでしょうか。
|
2
文章に合ったコードに修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
クラスにラムダ式を与えて、そのクラス
|
1
|
+
クラスにラムダ式を与えて、そのクラス内でstd::functionとして保持し、コールバック関数として機能させるようなものを実装したいと思っています。
|
2
2
|
|
3
|
+
例えば、クラス生成時にラムダ式を与えて、そのクラスが破棄されるときに呼ばれるようなものを作りたいと考えています。
|
4
|
+
|
3
5
|
具体的には以下の様なイメージのコードが成立するようにしたいです(実際はコンパイルエラーを起こします)。
|
4
6
|
|
5
7
|
どのように書くべきでしょうか。
|
@@ -11,12 +13,21 @@
|
|
11
13
|
#include <functional>
|
12
14
|
|
13
15
|
class some_class {
|
16
|
+
|
14
|
-
|
17
|
+
private:
|
15
18
|
using call_back_func_t = boost::variant<
|
16
19
|
boost::none_t,
|
17
20
|
std::function<void()>,
|
18
21
|
std::function<void(int)>
|
19
22
|
>;
|
23
|
+
|
24
|
+
auto some_func() {
|
25
|
+
boost::apply_visitor(call_back_visitor(), call_back_);
|
26
|
+
}
|
27
|
+
|
28
|
+
call_back_func_t call_back_;
|
29
|
+
|
30
|
+
public:
|
20
31
|
|
21
32
|
struct call_back_visitor : public boost::static_visitor<> {
|
22
33
|
auto operator()(boost::none_t const& none) const {}
|
@@ -24,34 +35,29 @@
|
|
24
35
|
auto operator()(std::function<void(int)> func, int x) const { func(x); }
|
25
36
|
};
|
26
37
|
|
27
|
-
auto some_func() {
|
28
|
-
boost::apply_visitor(call_back_visitor(), call_back_);
|
29
|
-
}
|
30
|
-
|
31
38
|
some_class(call_back_func_t call_back): call_back_(call_back){}
|
39
|
+
~some_class(){ some_func(); }
|
32
40
|
|
33
|
-
private:
|
34
|
-
call_back_func_t call_back_;
|
35
41
|
|
36
42
|
};
|
37
43
|
|
38
44
|
int main() {
|
45
|
+
|
39
46
|
int x = 5;
|
40
47
|
|
41
48
|
some_class a(
|
42
49
|
boost::none
|
43
50
|
);
|
44
|
-
a.some_func();
|
45
51
|
|
52
|
+
{
|
46
|
-
|
53
|
+
some_class b(
|
47
|
-
|
54
|
+
[]{ std::cout << "ok" << std::endl; }
|
48
|
-
|
55
|
+
);
|
49
|
-
|
56
|
+
}
|
50
57
|
|
51
58
|
some_class c(
|
52
59
|
[x](int x){ std::cout << x << std::endl; }
|
53
60
|
);
|
54
|
-
c.some_func();
|
55
61
|
|
56
62
|
/*
|
57
63
|
望まれる実行結果
|
1
コード追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -24,12 +24,12 @@
|
|
24
24
|
auto operator()(std::function<void(int)> func, int x) const { func(x); }
|
25
25
|
};
|
26
26
|
|
27
|
-
some_class(call_back_func_t call_back): call_back_(call_back){}
|
28
|
-
|
29
27
|
auto some_func() {
|
30
28
|
boost::apply_visitor(call_back_visitor(), call_back_);
|
31
29
|
}
|
32
30
|
|
31
|
+
some_class(call_back_func_t call_back): call_back_(call_back){}
|
32
|
+
|
33
33
|
private:
|
34
34
|
call_back_func_t call_back_;
|
35
35
|
|
@@ -41,14 +41,24 @@
|
|
41
41
|
some_class a(
|
42
42
|
boost::none
|
43
43
|
);
|
44
|
+
a.some_func();
|
44
45
|
|
45
46
|
some_class b(
|
46
|
-
[]{}
|
47
|
+
[]{ std::cout << "ok" << std::endl; }
|
47
48
|
);
|
49
|
+
b.some_func();
|
48
50
|
|
49
51
|
some_class c(
|
50
52
|
[x](int x){ std::cout << x << std::endl; }
|
51
53
|
);
|
54
|
+
c.some_func();
|
52
55
|
|
56
|
+
/*
|
57
|
+
望まれる実行結果
|
58
|
+
./a.out
|
59
|
+
ok
|
60
|
+
5
|
61
|
+
*/
|
62
|
+
|
53
63
|
}
|
54
64
|
```
|