teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

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

2015/10/08 11:09

投稿

taratail
taratail

スコア76

title CHANGED
File without changes
body CHANGED
@@ -58,7 +58,7 @@
58
58
  }
59
59
 
60
60
  some_class c(
61
- [x](int x){ std::cout << x << std::endl; }
61
+ [x](){ std::cout << x << std::endl; }
62
62
  );
63
63
 
64
64
  /*

3

補足追記

2015/10/08 11:09

投稿

taratail
taratail

スコア76

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

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

2015/10/08 08:20

投稿

taratail
taratail

スコア76

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
- public:
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
- some_class b(
53
+ some_class b(
47
- []{ std::cout << "ok" << std::endl; }
54
+ []{ std::cout << "ok" << std::endl; }
48
- );
55
+ );
49
- b.some_func();
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

コード追記

2015/10/08 08:09

投稿

taratail
taratail

スコア76

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
  ```