fork(1) download
  1. #include <boost/function.hpp>
  2. #include <boost/bind.hpp>
  3. #include <boost/variant.hpp>
  4. #include <map>
  5. #include <boost/foreach.hpp>
  6.  
  7. class CallBackManager {
  8.  
  9. public:
  10. typedef boost::function<void()> DisplaySig;
  11. typedef boost::function<void(int, int)> MouseSig;
  12. typedef boost::variant<DisplaySig, MouseSig> AnySig;
  13.  
  14. enum CallBackType { DISPLAY = 1 << 0, MOUSE = 1 << 1 };
  15. struct display_callback_t;
  16.  
  17. void AddCallback(CallBackType type, int hwnd, AnySig f) {
  18. using boost::get;
  19. switch(type) {
  20. case DISPLAY: return addDisplayCallback(hwnd, get<DisplaySig>(f));
  21. case MOUSE: return addMouseCallback(hwnd, get<MouseSig>(f));
  22. default: throw std::runtime_error("Unsupported CallBackType");
  23. }
  24. }
  25.  
  26. void test() {
  27. for (auto& f : _display_callback)
  28. boost::get<DisplaySig>(f.second)();
  29. for (auto& f : _mouse_callback)
  30. boost::get<MouseSig>(f.second)(rand(), rand());
  31. }
  32. private:
  33. void addDisplayCallback(int hwnd, DisplaySig f) { _display_callback.emplace(hwnd, f); }
  34. void addMouseCallback(int hwnd, MouseSig f) { _mouse_callback.emplace(hwnd, f); }
  35.  
  36. std::map<int, AnySig> _display_callback, _mouse_callback;
  37. };
  38.  
  39. #include <iostream>
  40. struct Foo {
  41.  
  42. int my_handle;
  43. CallBackManager cbm;
  44.  
  45. Foo()
  46. {
  47. cbm.AddCallback(CallBackManager::DISPLAY, my_handle,
  48. CallBackManager::DisplaySig(boost::bind(&Foo::Display, this)));
  49.  
  50. cbm.AddCallback(CallBackManager::MOUSE, my_handle,
  51. CallBackManager::MouseSig(boost::bind(&Foo::Mouse, this, _1, _2)));
  52. }
  53.  
  54. void Mouse(int, int) {
  55. std::cout << __PRETTY_FUNCTION__ << "\n";
  56. }
  57. void Display() {
  58. std::cout << __PRETTY_FUNCTION__ << "\n";
  59. }
  60. };
  61.  
  62. int main() {
  63. Foo instance;
  64. instance.cbm.test();
  65. }
Compilation error #stdin compilation error #stdout 0s 3092KB
stdin
Standard input is empty
compilation info
prog.cpp: In member function 'void CallBackManager::test()':
prog.cpp:26:20: error: ISO C++ forbids declaration of 'f' with no type [-fpermissive]
         for (auto& f : _display_callback)
                    ^
prog.cpp:26:24: error: range-based 'for' loops are not allowed in C++98 mode
         for (auto& f : _display_callback)
                        ^
prog.cpp:27:38: error: request for member 'second' in 'f', which is of non-class type 'int'
             boost::get<DisplaySig>(f.second)();
                                      ^
prog.cpp:28:20: error: ISO C++ forbids declaration of 'f' with no type [-fpermissive]
         for (auto& f : _mouse_callback)
                    ^
prog.cpp:28:24: error: range-based 'for' loops are not allowed in C++98 mode
         for (auto& f : _mouse_callback)
                        ^
prog.cpp:29:36: error: request for member 'second' in 'f', which is of non-class type 'int'
             boost::get<MouseSig>(f.second)(rand(), rand());
                                    ^
prog.cpp: In member function 'void CallBackManager::addDisplayCallback(int, CallBackManager::DisplaySig)':
prog.cpp:32:73: error: 'class std::map<int, boost::variant<boost::function<void()>, boost::function<void(int, int)> > >' has no member named 'emplace'
     void addDisplayCallback(int hwnd, DisplaySig f) { _display_callback.emplace(hwnd, f); }
                                                                         ^
prog.cpp: In member function 'void CallBackManager::addMouseCallback(int, CallBackManager::MouseSig)':
prog.cpp:33:71: error: 'class std::map<int, boost::variant<boost::function<void()>, boost::function<void(int, int)> > >' has no member named 'emplace'
     void addMouseCallback(int   hwnd, MouseSig f)   { _mouse_callback.emplace(hwnd, f); }
                                                                       ^
stdout
Standard output is empty