std C++ slot signal机制

来源:互联网 发布:投稿系统php源码 编辑:程序博客网 时间:2024/06/07 15:05
[cpp] view plain copy
 print?
  1. #include <iostream>  
  2. #include <vector>  
  3. #include <functional>  
  4. #include <algorithm>  
  5. using namespace std;  
  6. class A{  
  7. public:  
  8.     void Clicked(int id)  
  9.     {  
  10.         cout << "A::Clicked" << endl;     
  11.     }  
  12. };  
  13. class B{  
  14. public:  
  15.     void Clicked(int id)  
  16.     {  
  17.         cout << "B::Clicked" << endl;     
  18.     }  
  19. };  
  20. class SlotBase{  
  21. public:  
  22.     virtual void OnSignal(int id) = 0;  
  23. };  
  24. template<class T>  
  25. class Slot : public SlotBase{  
  26. public:  
  27.     typedef void (T::*MemberFuncType)(int);   
  28.     Slot(T* obj, MemberFuncType func)  
  29.         :obj_(obj), func_(func)  
  30.     {  
  31.     }  
  32.       
  33.     virtual void OnSignal(int id)  
  34.     {  
  35.         (obj_->*func_)(id);  
  36.     }  
  37. private:  
  38.     T* obj_;  
  39.     MemberFuncType func_;  
  40. };  
  41. template<class T>  
  42. SlotBase* MakeSlot(T * p, void (T::*func)(int))  
  43. {  
  44.     return new Slot<T>( p, func ) ;   
  45. }  
  46. class Signal  
  47. {  
  48. public:  
  49.     virtual ~Signal()  
  50.     {  
  51.         std::for_each(slots_.begin(), slots_.end(), SignalDelete());  
  52.     }  
  53.     struct SignalDelete: public unary_function<SlotBase*, void>  
  54.     {  
  55.     public:  
  56.         void operator()(SlotBase*& slot) const  
  57.         {  
  58.             delete slot;  
  59.         }  
  60.     };  
  61.     struct SignalAction: public binary_function<SlotBase*, intvoid>  
  62.     {  
  63.     public:  
  64.         void operator()(SlotBase*& slot, const int& i) const  
  65.         {  
  66.             slot->OnSignal(i);  
  67.         }  
  68.     };  
  69.     void signal(int id)  
  70.     {   
  71.         std::for_each(slots_.begin(), slots_.end(), bind2nd(SignalAction(), id));  
  72.     }  
  73.     void connect( SlotBase* s)   
  74.     {  
  75.         slots_.push_back(s);   
  76.     }  
  77. protected:  
  78.     vector< SlotBase* >   slots_;  
  79. };  
  80. int _tmain(int argc, _TCHAR* argv[])  
  81. {  
  82.     A a;  
  83.     B b;  
  84.     Signal signal;  
  85.     signal.connect(MakeSlot(&a, &A::Clicked));  
  86.     signal.connect(MakeSlot(&b, &B::Clicked));  
  87.     signal.signal(1);  
  88.     return 0;  

  1. }  
转载地址:http://blog.csdn.net/hhyttppd/article/details/4192668

0 0