language: C++ 4.7.2 (gcc-4.7.2)
date: 751 days 7 hours ago
link:
visibility: private
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
 
// fwd declare
class Button;
 
class BtnCallbackBase{
public:
  virtual void operator()(Button*) = 0;
};
 
template<class C>
class BtnCallback : public BtnCallbackBase{
private:
  typedef void (C::*callback_func)(Button*);
  
  C* _object;
  callback_func _onclick;
  
public:
  BtnCallback(C* obj, callback_func func)
    : _object(obj)
    , _onclick(func)
  {}
 
  virtual void operator()(Button* btn){
    (_object->*_onclick)(btn);
  }
};
 
 
class Button{
public:
  Button()
    : _onclick(0)
  {}
 
  void Click(){
    if(_onclick != 0)
      (*_onclick)(this);
  }
 
  template<class C>
  void RegisterCallback(C* obj, void (C::*func)(Button*)){
    // cleanup old callback, deleting null pointer is a noop
    delete _onclick;
    _onclick = new BtnCallback<C>(obj,func);
  }
 
  ~Button(){
    delete _onclick;
  }
 
private:
  BtnCallbackBase* _onclick;
};
 
class MyClass{
public:
  void ExampleCallback(Button* btn){
    std::cout << "Callback works!\n";
  }
};
 
int main(){
  Button btn;
  MyClass test;
  
  btn.RegisterCallback(&test, &MyClass::ExampleCallback);
 
  btn.Click();
}