C++ 0x 使用可变参数模板类 实现 C# 的委托机制
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #ifndef _ZTC_DELEGATE_H_ 2 #define _ZTC_DELEGATE_H_ 3 4 #include <vector> 5 #include <functional> 6 7 /// 8 // C++ 使用 可变参数模板类, 来实现 9 // C#中的 委托 10 // Anchor: ztc 11 // Date : 2014-01-10 12 /// 13 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 } 23 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 } 37 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 }; 49 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 } 60 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 } 75 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 }; 85 86 #endif // _ZTC_DELEGATE_H_
ztc_Delegate.hpp
1 #include <iostream> 2 #include "ztc_Delegate.hpp" 3 // 普通函数 4 int foo(int a, int b) { 5 return a * a + b * b; 6 } 7 // 普通无参无返回函数 8 void kaoo() { 9 std::cout << "kaooooooo" << std::endl; 10 } 11 void kaoo2() { 12 std::cout << "kaooooo22222oo" << std::endl; 13 } 14 // 类成员函数15 class Test { 16 public: 17 void funcInClass() { 18 std::cout << "Function In Class" << std::endl; 19 } 20 }; 21 22 int main() { 23 // 定义事件 有返回值 24 Delegate<int, int, int> OnSomething; 25 // 定义事件 无返回值 26 Delegate<void> OnKao; 27 28 // 注册方法 29 OnSomething += [](int a, int b) {return a + b; }; 30 OnSomething += [](int a, int b) {return a * b; }; 31 OnSomething += foo; 32 33 // 类的成员函数 需要 使用 Bind 34 Test c; 35 auto cf = std::bind(&Test::funcInClass, c); 36 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(); 50 51 // 调用事件 得到 结果 52 auto ret = OnSomething(2, 6); 53 54 // 显示结果 55 for (auto r : ret) { 56 std::cout << r << std::endl; 57 } 58 59 return 0; 60 }
转载于:https://www.cnblogs.com/easyfrog/p/3513487.html
C++ 0x 使用可变参数模板类 实现 C# 的委托机制相关推荐
- C++ Variadic Templates(可变参数模板)
本文参考侯捷老师的视频:https://www.youtube.com/watch?v=TJIb9TGfDIw&list=PL-X74YXt4LVYo_bk-jHMV5T3LHRYRbZoH ...
- C++11 -------- 类的新功能+可变参数模板+emplace接口
目录 类的新功能 1.默认成员函数 (1)八个默认成员函数 (2)默认移动构造和移动赋值的生成条件 (3)默认生成的移动构造和移动赋值会做什么 (4)验证默认生成的移动构造和移动赋值所做的工作 2.类 ...
- 可变参数模板、右值引用带来的移动语义完美转发、lambda表达式的理解
可变参数模板 可变参数模板对参数进行了高度泛化,可以表示任意数目.任意类型的参数: 语法为:在class或者typename后面带上省略号. Template<class ... T> v ...
- 【C++】C++11新特性——可变参数模板|function|bind
文章目录 一.可变参数模板 1.1 可变参数的函数模板 1.2 递归函数方式展开参数包 1.3 逗号表达式展开参数包 1.4 empalce相关接口函数 二.包装器function 2.1 funct ...
- C++可变参数模板的展开方式
文章目录 前言 可变参数模板的定义 参数包的展开 递归函数方式展开 逗号表达式展开 enable_if方式展开 折叠表达式展开(c++17) 总结 前言 可变参数模板(variadic templat ...
- 可变参数模板 Variadic Templates
可变参数模板 Variadic Templates 可变参数模板 可变参数模板的例子 重载可变和非可变参数模板 sizeof... 操作符 折叠表达式 可变参数模板的应用 可变参数类模板和可变表达式 ...
- C++_可变参数模板到emplace_back再到construct再到forward
C++_可变参数模板到emplace_back再到construct再到forward 1.可变参数模板 具体定义如下图所示: 编写一个可变参数版本: 1.1sizeof-运算符 2.emplace_ ...
- ios开发读取剪切板的内容_iOS中管理剪切板的UIPasteboard粘贴板类用法详解
一.自带剪切板操作的原生UI控件在iOS的UI系统中,有3个控件自带剪切板操作,分别是UITextField.UITextView与UIWebView.在这些控件的文字交互处进行长按手势可以在屏幕视图 ...
- 可变参数模板(参考《C++ Templates 英文版第二版》)
可变参数模板(参考<C++ Templates 英文版第二版>) Chapter 4 可变参数模板 自从C++11,模板可以接受可变数量的参数 4.1 可变参数模板 可以定义模板,去接受无 ...
最新文章
- linux 挂载分区inode,Linux中分区挂载和LABEL的指定
- Kafka集群配置说明
- 深入javascript——构造函数和原型对象
- [MATLAB调试笔记]时变循环诊断——[Vx(x)],[Vx(t),Vy(t),Vz(t)],[Ex(x)],[波];[Eng(t)],[Ex(k)],[Ex(x,t)],[logEx(x.t)]
- 如何高效学Python?好用的爬虫工具又有哪些?
- sysdig案例分析 - 哪些文件正在被进程访问
- VUE初始化一个项目
- java httpclient 重定向_如何在HttpClient中自动重定向(java,apache)
- 电脑重启f12怎么处理_电脑开机按f12怎么恢复系统(详解f12的使用方法)
- 无法执行该VI,必须使用LabVIEW完整版开发系统才可以解决该错误
- typeof与instanceof的区别
- C# 5.0 CallerMemberName CallerFilePath CallerLineNumber获取调用方法名称,路径,行号
- IE10首个修复补丁出现 解决ASP.NET兼容性
- Oracle OCP和MySQL OCP认证考试内容有哪些?
- 数据库 --- 约束
- Vs2019 打包项目程序和安装卸载程序
- div和span标签以及标签分类
- 【AiLearning】test2:搭建Shallow Netural Network
- js实现加buff功能
- 端口Banner信息的获取