测试代码

  各种绑定方式

View Code
 #include "Event.h"
 
 using namespace std;
 
 
 void f1(int, int)
 {
     puts("f1()");
 }
 
 struct F2
 {
     F2() { puts("F2 construct"); }
     F2(const F2 &) { puts("F2 copy"); }
     F2(F2 &&) { puts("F2 move"); }
     F2& operator=(const F2 &)  { puts("F2 copy assign"); return *this; }
     F2& operator=(F2 &&)  { puts("F2 move assign"); return *this; }
 
     void f(int, int)
     {
         puts("f2()");
     }
 
     void fc(int, int) const
     {
         puts("f2c()");
     }
 };
 
 struct F3
 {
     F3() { puts("F3 construct"); }
     F3(const F3 &) { puts("F3 copy"); }
     F3(F3 &&) { puts("F3 move"); }
     F3& operator=(const F3 &)  { puts("F3 copy assign"); return *this; }
     F3& operator=(F3 &&)  { puts("F3 move assign"); return *this; }
 
     void operator ()(int, int) const
     {
         puts("f3()");
     }
 };
 
 int _tmain(int argc, _TCHAR* argv[])
 {
     Utility::Event<int, int> e;
 
     // 一般函数
     e.addHandler(f1);
 
     int id = e.addHandler(&f1);                                  
     e.removeHandler(id);                                                // 移除事件处理函数
   
 
     // 成员函数
     using namespace std::placeholders;
 
     F2 f2;
     const F2 *pf2 = &f2;
 
     e.addHandler(bind(&F2::f, &f2, _1, _2));        // std::bind
     e.addHandler(&f2, &F2::f);
 
     e.addHandler(pf2, &F2::fc);                                    // 常量指针
   
     puts("----addHandler(f2, &F2::f)----");
     e.addHandler(f2, &F2::f);                                        // 对象拷贝构造
 
     puts("----addHandler(F2(), &F2::f)----");
     e.addHandler(F2(), &F2::f);                                    // 对象转移构造
 
     puts("--------");
 
 
     // 仿函数
     F3 f3;
     const F3 *pf3 = &f3;
 
     puts("----addHandler(f3)----");
     e.addHandler(f3);                                                        // 对象拷贝构造
 
     puts("----addHandler(F3())----");
     e.addHandler(F3());                                                    // 对象转移构造
     puts("--------");
 
     e.addHandler(ref(f3));                                            // 引用仿函数对象
     e.addHandler(ref(*pf3));                                        // 引用仿函数常量对象
 
     puts("--------");
 
     // Lambda表达式
     e.addHandler([](int, int) {
         puts("f4()");
     });
 
     // 激发事件
     e(1, 2);
 
     return 0;
 }