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# 的委托机制相关推荐

  1. C++ Variadic Templates(可变参数模板)

    本文参考侯捷老师的视频:https://www.youtube.com/watch?v=TJIb9TGfDIw&list=PL-X74YXt4LVYo_bk-jHMV5T3LHRYRbZoH ...

  2. C++11 -------- 类的新功能+可变参数模板+emplace接口

    目录 类的新功能 1.默认成员函数 (1)八个默认成员函数 (2)默认移动构造和移动赋值的生成条件 (3)默认生成的移动构造和移动赋值会做什么 (4)验证默认生成的移动构造和移动赋值所做的工作 2.类 ...

  3. 可变参数模板、右值引用带来的移动语义完美转发、lambda表达式的理解

    可变参数模板 可变参数模板对参数进行了高度泛化,可以表示任意数目.任意类型的参数: 语法为:在class或者typename后面带上省略号. Template<class ... T> v ...

  4. 【C++】C++11新特性——可变参数模板|function|bind

    文章目录 一.可变参数模板 1.1 可变参数的函数模板 1.2 递归函数方式展开参数包 1.3 逗号表达式展开参数包 1.4 empalce相关接口函数 二.包装器function 2.1 funct ...

  5. C++可变参数模板的展开方式

    文章目录 前言 可变参数模板的定义 参数包的展开 递归函数方式展开 逗号表达式展开 enable_if方式展开 折叠表达式展开(c++17) 总结 前言 可变参数模板(variadic templat ...

  6. 可变参数模板 Variadic Templates

    可变参数模板 Variadic Templates 可变参数模板 可变参数模板的例子 重载可变和非可变参数模板 sizeof... 操作符 折叠表达式 可变参数模板的应用 可变参数类模板和可变表达式 ...

  7. C++_可变参数模板到emplace_back再到construct再到forward

    C++_可变参数模板到emplace_back再到construct再到forward 1.可变参数模板 具体定义如下图所示: 编写一个可变参数版本: 1.1sizeof-运算符 2.emplace_ ...

  8. ios开发读取剪切板的内容_iOS中管理剪切板的UIPasteboard粘贴板类用法详解

    一.自带剪切板操作的原生UI控件在iOS的UI系统中,有3个控件自带剪切板操作,分别是UITextField.UITextView与UIWebView.在这些控件的文字交互处进行长按手势可以在屏幕视图 ...

  9. 可变参数模板(参考《C++ Templates 英文版第二版》)

    可变参数模板(参考<C++ Templates 英文版第二版>) Chapter 4 可变参数模板 自从C++11,模板可以接受可变数量的参数 4.1 可变参数模板 可以定义模板,去接受无 ...

最新文章

  1. linux 挂载分区inode,Linux中分区挂载和LABEL的指定
  2. Kafka集群配置说明
  3. 深入javascript——构造函数和原型对象
  4. [MATLAB调试笔记]时变循环诊断——[Vx(x)],[Vx(t),Vy(t),Vz(t)],[Ex(x)],[波];[Eng(t)],[Ex(k)],[Ex(x,t)],[logEx(x.t)]
  5. 如何高效学Python?好用的爬虫工具又有哪些?
  6. sysdig案例分析 - 哪些文件正在被进程访问
  7. VUE初始化一个项目
  8. java httpclient 重定向_如何在HttpClient中自动重定向(java,apache)
  9. 电脑重启f12怎么处理_电脑开机按f12怎么恢复系统(详解f12的使用方法)
  10. 无法执行该VI,必须使用LabVIEW完整版开发系统才可以解决该错误
  11. typeof与instanceof的区别
  12. C# 5.0 CallerMemberName CallerFilePath CallerLineNumber获取调用方法名称,路径,行号
  13. IE10首个修复补丁出现 解决ASP.NET兼容性
  14. Oracle OCP和MySQL OCP认证考试内容有哪些?
  15. 数据库 --- 约束
  16. Vs2019 打包项目程序和安装卸载程序
  17. div和span标签以及标签分类
  18. 【AiLearning】test2:搭建Shallow Netural Network
  19. js实现加buff功能
  20. 端口Banner信息的获取

热门文章

  1. Java——网络编程(实现基于命令行的多人聊天室)
  2. T-SQL 中ON和WHERE的区别
  3. shell比较运算符
  4. 艾伟也谈项目管理,我是如何带领团队开发项目的
  5. Linux下遍历目录下的文件
  6. Loading页的实现代码
  7. 产品经理和项目经理有哪些区别?
  8. mysql宏参数_C语言带参数的宏定义
  9. dvwa如何打开_DVWA详细 安装
  10. 解决:未能将管道连接到虚拟机: 所有的管道范例都在使用中。