转自:http://www.cnblogs.com/qicosmos/p/3154174.html

(原创)c++11改进我们的模式之改进代理模式,实现通用的AOP框架

c++11 boost技术交流群:296561497,欢迎大家来交流技术。

本次要讲的时候如何改进代理模式,具体来说是动态代理模式,动态代理模式一般实现AOP框架,不懂AOP的童鞋看这里。我前面的博文也实现了一个AOP框架(可以参考我前面的博文:(原创) C++ 轻量级AOP框架),但是那个AOP框架存在一个缺陷,就是不支持切面的组合,这一点大大降低了其通用性,本次通过c++11改进,使AOP框架更完善:支持切面组合,不要求切面必须派生于某个基类,不用虚函数调用,性能更好,功能更强大。

上代码:

struct Aspect : boost::noncopyable
{template<typename Func>Aspect(const Func& f) : m_func(f){}template<typename T>void Invoke(T&& value){value.Before();m_func();value.After();}template<typename Head, typename... Tail>void Invoke(Head&& head, Tail&&... tail){head.Before();Invoke(std::forward<Tail>(tail)...);head.After();}private:std::function<void()> m_func;
};template<typename... AP>
void Invoke(const std::function<void ()>& f)
{Aspect msp(f);msp.Invoke(AP()...);
}

切面有要求,切面类中必须要有Before/After方法,否则编译不过,允许空实现。

测试代码:

struct AA
{void Before(){cout<<"Before from AA"<<endl;}void After(){cout<<"After from AA"<<endl;}
};struct BB
{void Before(){cout<<"Before from BB"<<endl;}void After(){cout<<"After from BB"<<endl;}
};struct CC
{void Before(){cout<<"Before from CC"<<endl;}void After(){cout<<"After from CC"<<endl;}
};struct TT
{void g(){cout<<"real g function"<<endl;}void h(int a){cout<<"real h function: "<<a<<endl;}
};struct DD
{void Before(){}void After(){}
};void GT()
{cout<<"real GT function"<<endl;
}void HT(int a)
{cout<<"real HT function: "<<a<<endl;
}void TestAOP()
{TT tt; std::function<void()> ff = std::bind(&TT::g, &tt);//组合了两个切面AA BBInvoke<AA,BB>([&ff](){ff();}); //织入成员函数Invoke<AA,BB>([&tt](){tt.g();}); //织入对象int aa = 3;Invoke<AA,BB>(&GT); //织入方法Invoke<AA,BB>([aa](){HT(aa);});//织入带参的方法//织入带参数的成员函数和对象std::function<void(int)> ff1 = std::bind(&TT::h, &tt, std::placeholders::_1);Invoke<AA,BB,CC,DD>([&ff1,aa](){ff1(aa);}); //组合了四个切面Invoke<AA,BB>([&tt,aa](){tt.h(aa);});
}    

测试结果:

更新:代码在GCC下编译没问题,但在vs2013下编译不过,是微软的bug,如果要在vs2013下编译通过,需要做一点修改:

template<typename T> using identity_t = T;template<typename... AP>
void Invoke(const std::function<void()>& f)
{Aspect msp(f);msp.Invoke(identity_t<AP>()...);
}

一点梦想:尽自己一份力,让c++的世界变得更美好!

面向切面编程--AOP(二)相关推荐

  1. 大数据WEB阶段Spring框架 AOP面向切面编程(二)

    Spring AOP面向切面编程(二) 一.切入点的execution表达式 execution的表达形式: execution(修饰符? 返回值类型 所在包类? 方法名(参数列表) 异常?) ?表示 ...

  2. Spring in Action 入门之面向切面编程AOP

    注明:这篇文章一是当成学习笔记,二是给大家提供另一个快速理解学习Spring的参考.欢迎留言讨论,持续更新中~ (该部分是Spring的面向切面编程AOP) 第四章 通知Bean 在软件编程中,散布于 ...

  3. 九、面向切面编程AOP

    本栏博客目录 一.Spring的IOC和DI 二.IoC和DI注解开发 三.SpringMVC入门 四.SpringMVC的请求和响应 五.JdbcTemplate 六.Spring练习 七.Spri ...

  4. 服务端第三次课程:面向切面编程AOP

    3:面向切面编程AOP 1:回顾 bean的组装方式 规划的装配 component autowired sacn是在configuration底下的 Java config 使用configurat ...

  5. Spring-学习笔记08【面向切面编程AOP】

    Java后端 学习路线 笔记汇总表[黑马程序员] Spring-学习笔记01[Spring框架简介][day01] Spring-学习笔记02[程序间耦合] Spring-学习笔记03[Spring的 ...

  6. Spring→面向切面编程AOP、相关概念、通知Advice类型、配置切面切入点通知、AOP相关API、AOP代理类ProxyFactoryBean、AOP注解@AspectJ

    面向切面编程AOP CGLib AOP相关概念 Advice类型 Spring实现AOP Spring配置切面aspect 配置切入点pointcut 配置通知advice 配置通知参数 调用新的父类 ...

  7. Spring(四):面向切面编程AOP

    2019独角兽企业重金招聘Python工程师标准>>> 横切关注点:分布于应用中多处的功能 面向切面编程AOP:将横切关注点与业务逻辑相分离 在使用面向切面编程时,仍在一个地方定义通 ...

  8. Spring之面向切面编程AOP(八)

    介绍&步骤 视频教程: https://www.bilibili.com/video/BV1WZ4y1P7Bp?p=121 官方笔记链接:https://pan.baidu.com/s/1dn ...

  9. java切面编程 切面概念,面向切面编程(AOP)初探

    面向对象编程通过设计和语言本身提供的模块化.封装.继承.多态来实现软件复用.尽管OOP在建模以及实现复杂软件方面非常成功,它仍然有一些问题.面向切面编程(AOP)被认为是一项有前途的新技术,它通过对交 ...

最新文章

  1. pandas.read_csv(path_features_known_csv, header=None)的用法
  2. merge into语句的使用
  3. 如何在移动设备上调试html5开发的网页
  4. types是什么意思中文翻译成_types 和 @types 是什么?
  5. 通过公式处理SAP Analytics Cloud里的dimension,使其符合Date格式需求
  6. java版本streamgobbler_java调用本地命令 Runtime class's exec() method
  7. 日期时间格式转化为方便理解的格式
  8. C++ opengl GL_LINE_LOOP的绘制
  9. 实现 Bootstrap 基本布局
  10. Oracle v$session/v$sql 表
  11. 【语言处理与Python】4.7算法设计
  12. SSL 1887——潜伏者
  13. sweetalert
  14. 纯色图制作APP代码
  15. 获取上个月第一天和最后一天
  16. 一键平仓含挂单全商品版脚本.mq4
  17. dw超链接标签_使用Dreamweaver制作网页超链接的详细图文教程--系统之家
  18. Android应用去广告方法盘点
  19. 计量语言学软件Altmann-Fitter阿尔特曼拟合器的使用简介(更新中)
  20. html网站video标签blob视频如何下载

热门文章

  1. python四则运算_四则运算 python
  2. 线程中task取消_Rust Async: async-task源码分析
  3. 国嵌c语言深度,国嵌C语言3部全
  4. 在java语法中继承_java中的继承
  5. php 获取已用空间,PHP5:获取导入的名称空间列表 - php
  6. sql server2008r2 没有提示_SQL学习之旅(1)
  7. 数据结构之链表--单链表
  8. 平台型时间信号强度曲线_哥测的不是BET,是氮气等温吸脱附曲线
  9. c语言链表集合求并集用字母表示,c语言实现的链表集合的并集与交集
  10. php 匹配关键字,php获取搜索引擎搜索关键词关键字的正则表达式实现方法