Guest User

Untitled

a guest
Jul 19th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.19 KB | None | 0 0
  1. Class A
  2. {
  3. public:
  4. void Action(){//...};
  5. };
  6.  
  7. class CallBack
  8. {
  9. //...
  10. // CallBack it self it is a NOT a template
  11. // It can wrap member template though
  12. };
  13.  
  14. class B
  15. {
  16. public:
  17. void SetCallback(CallBack to){
  18. m_cb = to;
  19. }
  20. void do_something()
  21. {
  22. //...
  23. m_cb.Execute();
  24. //...
  25. }
  26.  
  27. private:
  28. CallBack m_cb;
  29.  
  30. };
  31.  
  32. int main()
  33. {
  34. A obj1;
  35. CallBack cb = make_callback(&obj1, &A::Action);
  36. B obj2;
  37. obj2.SetCallback(cb);
  38. //....
  39. obj2.do_something();
  40. }
  41.  
  42. #include <iostream>
  43. #include <memory>
  44.  
  45. // INTERNAL CLASSES
  46.  
  47. class CallbackSpecBase
  48. {
  49. public:
  50. virtual ~CallbackSpecBase() {}
  51. virtual void operator()(...) const = 0;
  52. };
  53.  
  54. template<class C, class T>
  55. class CallbackSpec : public CallbackSpecBase
  56. {
  57. public:
  58. CallbackSpec(C& o, T m) : obj(o), method(m) {}
  59. /*line 18*/ void operator()(...) const { (&obj->*method)(); } // how to pass "..." into method(...)
  60.  
  61. private:
  62. C& obj;
  63. T method;
  64. };
  65.  
  66. // PUBLIC API
  67.  
  68. class Callback
  69. {
  70. public:
  71. Callback() {}
  72.  
  73. void operator()() { (*spec)(); }
  74.  
  75. template<class C, class T>
  76. void set(C& o, T m) { spec.reset(new CallbackSpec<C, T>(o, m)); }
  77.  
  78. private:
  79. std::auto_ptr<CallbackSpecBase> spec;
  80. };
  81.  
  82. // TEST CODE
  83.  
  84. class Test
  85. {
  86. public:
  87. void foo() { std::cout << "Working" << std::endl; }
  88. void bar() { std::cout << "Like a charm" << std::endl; }
  89. };
  90.  
  91. int main()
  92. {
  93. Test t;
  94. Callback c;
  95. c.set(t, &Test::foo);
  96. c();
  97. c.set(t, &Test::bar);
  98. c();
  99. }
  100.  
  101. class A
  102. {
  103. public:
  104. void Action() {//...};
  105. };
  106.  
  107. class B
  108. {
  109. public:
  110. template <typename Func>
  111. void SetCallback(Func func) {
  112. m_cb = func;
  113. }
  114.  
  115. void do_something() {
  116. m_cb(); // whatever function
  117. }
  118.  
  119. private:
  120. std::function<void()> m_cb; // anything callable with no arguments
  121. };
  122.  
  123. int main()
  124. {
  125. A obj1;
  126. B obj2;
  127.  
  128. obj2.SetCallback(make_callback(&obj1, &A::Action));
  129. // or:
  130. obj2.SetCallback(std::bind(&obj1, &A::Action)); // or boost::bind
  131.  
  132. obj2.do_something();
  133. }
  134.  
  135. class B
  136. {
  137. public:
  138. void SetCallback(CDelegate f_Delegate)
  139. {
  140. m_Delegate = f_Delegate;
  141. }
  142. static void do_something()
  143. {
  144. //...
  145. m_Delegate();
  146. //...
  147. }
  148.  
  149. private:
  150. static CDelegate m_Delegate;
  151. };
  152.  
  153. #include <memory>
  154.  
  155. template< typename R, typename ... Args >
  156. class CallbackBase
  157. {
  158. public:
  159. typedef std::shared_ptr< CallbackBase< R, Args... > >
  160. CallbackPtr;
  161.  
  162. virtual ~CallbackBase()
  163. {
  164. }
  165. virtual R Call( Args ... args) = 0;
  166. };
  167.  
  168. template< typename R, typename ... Args >
  169. class FunctionCallback : public CallbackBase< R, Args... >
  170. {
  171. public:
  172. typedef R (*funccb)(Args...);
  173.  
  174. FunctionCallback( funccb cb_ ) :
  175. CallbackBase< R, Args... >(),
  176. cb( cb_ )
  177. {
  178. }
  179. virtual ~FunctionCallback()
  180. {
  181. }
  182. virtual R Call(Args... args)
  183. {
  184. return cb( args... );
  185. }
  186. private:
  187. funccb cb;
  188. };
  189.  
  190. template < typename R, typename ...Args >
  191. typename CallbackBase< R, Args... >::CallbackPtr
  192. MakeCallback( R (*cb)(Args...) )
  193. {
  194. typename CallbackBase< R, Args... >::CallbackPtr
  195. p( new FunctionCallback< R, Args... >( cb )
  196. );
  197. return p;
  198. }
  199.  
  200. bool Foo_1args( const int & t)
  201. {
  202. return true;
  203. }
  204. int main()
  205. {
  206. auto cbObj = MakeCallback( & Foo_1args );
  207. }
Add Comment
Please, Sign In to add comment