添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
7 ///////////////////////////////////////////// // 8 // C++ 使用 可变参数模板类, 来实现 9 // C#中的 委托 10 // Anchor: ztc 11 // Date : 2014-01-10 12 ///////////////////////////////////////////// // 14 template<typename R, typename ...Args> 15 class Delegate { 16 public : 17 template<typename U> 18 Delegate& operator += ( const U & func) { 19 funcList.push_back(std::function<R(Args...)> (func)); 20 funcPointers.push_back(( void *)& func); 21 return * this ; 22 } 24 template<typename U> 25 Delegate& operator -= ( const U & func) { 26 int i = - 1 ; 27 for (auto iter = funcPointers.begin(); iter != funcPointers.end(); iter++ ) { 28 i++ ; 29 if (*iter == ( void *)& func) { 30 funcPointers.erase(iter); 31 funcList.erase(funcList.begin() + i); 32 break ; 33 } 34 } 35 return * this ; 36 } 38 std::vector<R> operator ()(Args...args) { 39 std::vector<R> ret; 40 for (auto f : funcList) { 41 ret.push_back(f(args...)); 42 } 43 return ret; 44 } 45 private : 46 std::vector<std::function<R(Args...)>> funcList; 47 std::vector< void *> funcPointers; 48 }; 50 template<typename ...Args> 51 class Delegate< void , Args...> { 52 public : 53 template<typename U> 54 Delegate& operator += ( const U & func) { 55 std::cout << " 注册方法 " << typeid(func).name() << std::endl; 56 funcList.push_back(std::function< void (Args...)> (func)); 57 funcPointers.push_back(( void *)& func); 58 return * this ; 59 } 61 template<typename U> 62 Delegate& operator -= ( const U & func) { 63 std::cout << " 卸载方法 " << typeid(func).name() << std::endl; 64 int i = - 1 ; 65 for (auto iter = funcPointers.begin(); iter != funcPointers.end(); iter++ ) { 66 i++ ; 67 if (*iter == ( void *)& func) { 68 funcPointers.erase(iter); 69 funcList.erase(funcList.begin() + i); 70 break ; 71 } 72 } 73 return * this ; 74 } 76 void operator () (Args... args) { 77 for (auto f : funcList) { 78 f(args...); 79 } 80 } 81 private : 82 std::vector<std::function< void (Args...)>> funcList; 83 std::vector< void *> funcPointers; 84 }; 86 #endif // _ZTC_DELEGATE_H_ ztc_Delegate.hpp
 1 #include <iostream>
 2 #include "ztc_Delegate.hpp"
  // 普通函数
4 int foo(int a, int b) { 5 return a * a + b * b;   // 普通无参无返回函数
8 void kaoo() { 9 std::cout << "kaooooooo" << std::endl; 10 } 11 void kaoo2() { 12 std::cout << "kaooooo22222oo" << std::endl; 13 }   // 类成员函数
15 class Test { 16 public: 17 void funcInClass() { 18 std::cout << "Function In Class" << std::endl; 19 } 20 }; 22 int main() { 23 // 定义事件 有返回值 24 Delegate<int, int, int> OnSomething; 25 // 定义事件 无返回值 26 Delegate<void> OnKao; 28 // 注册方法 29 OnSomething += [](int a, int b) {return a + b; }; 30 OnSomething += [](int a, int b) {return a * b; }; 31 OnSomething += foo; 33 // 类的成员函数 需要 使用 Bind 34 Test c; 35 auto cf = std::bind(&Test::funcInClass, c); 37 // 注册类成员函数 38 OnKao += cf; 39 // 注册普通函数 40 OnKao += kaoo; 41 OnKao += kaoo2; 42 // 调用事件 43 OnKao(); 44 // 卸载类成员函数 45 OnKao -= cf; 46 // 制裁普通函数 47 OnKao -= kaoo; 48 // 调用方法 49 OnKao(); 51 // 调用事件 得到 结果 52 auto ret = OnSomething(2, 6); 54 // 显示结果 55 for (auto r : ret) { 56 std::cout << r << std::endl; 57 } 59 return 0;