面向切面编程--AOP(二)

转自: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++的世界变得更美好!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TimesIsMoney

Problem Description 给你一个序列&#xff0c;有N个整数&#xff08;int以内&#xff09;&#xff0c;判断一个数在这个序列中出现几次。 Input 多组输入&#xff0c;输入到文件结尾 首先输入一个n&#xff0c;然后输入n个整数。 在输入一个m&#xff0c;代表查询的个数 &…

redis参考优秀文章

文章地址 写的很详细&#xff0c;做个记录

VS2013常用快捷键设置

Visual Studio 2013 是一个基本完整的开发工具集&#xff0c;它包括了整个软件生命周期中所需要的大部分工具&#xff0c;如UML工具、代码管控工具、集成开发环境(IDE)等等。VS 2013 中新增了很多提高开发人员工作效率的新功能&#xff0c;比如自动补全方括号、使用快捷键移动整…

多次访问redis造成redis连接总是断开的解决方案

之前做了一个新闻推荐项目用到redis&#xff0c;当把项目发布到线上去测试的时候&#xff0c;用两个redis(线上服务采用LVS负载均衡&#xff0c;两个可以切换)的时候发现开始跑的时候没有问题&#xff0c;但是过一段时间当用户访问量特别大的时候有一个redis总断开连接的问题&a…

USB Flash Drives

Description Sean is trying to save a large file to a USB flash drive. He has n USB flash drives with capacities equal to a1, a2, ..., an megabytes. The file size is equal to m megabytes. Find the minimum number of USB flash drives needed to write Seans …

VS2013+VSVIM

上世纪90年代后期出现了一股.com热潮&#xff0c;相信大家对其都有美好的回忆&#xff0c;那时使用CGI和Perl创建“动态的”网站&#xff0c;通过使用在Unix上的vi编辑器快速打字和格式化&#xff0c;这也包括后来使用的vi的复制版本vim。我可能是怀旧的&#xff0c;但我想念将…

activeMQ发送与接受消息模板代码

发送着&#xff1a; /*** */ package activemqAPI.helloworld;import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.DeliveryMode; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.MessageProducer; import …

做一个优秀的项目/产品经理

1、工作中&#xff0c;在时间、质量、成本三者之间找到平衡&#xff0c;带领团队成功研发并上线项目。 解决好以下细节问题&#xff0c;就达到一个合格IT项目经理了&#xff1a; 项目的由来&#xff0c;为什么要建立这么一个系统&#xff1f; 项目有计划吗&#xff1f; 项目的需…

一个程序员的日常书单

本想谈谈读书这个话题,想来想起觉得无从下手,就此作罢.毕业这几年,一直不敢放松,在现代这个互联网时代更加认同萧抡谓的”一日不读书,胸臆无佳想;一月不读书,耳目失清爽”.如果非要给自己找个读书的理由的话,这句诗就是最好的理由:”胸藏文墨虚若骨,腹有诗书气自华”. 与书结缘…

【转载】ssdb安装部署

转载地址&#xff1a;https://www.cnblogs.com/dyfblog/p/5894518.html ssdb是一款类似于redis的nosql数据库&#xff0c;不过redis是基于内存的&#xff0c;服务器比较昂贵&#xff0c;ssdb则是基于硬盘存储的&#xff0c;很容易扩展&#xff0c;对于一些对速度要求不是太高的…

2017年回顾及总结

从2015毕业至今&#xff0c;在c开发领域算起来已经差不多两年多的时间了。在这三年的时间里&#xff0c;涉及到的c领域的技术基本上从广度上有了一个大概的学习和认知。各个方面的知识都有所掌握&#xff0c;包括c底层实现&#xff0c;网络通信&#xff0c;并行开发&#xff0c…

Amr and Pins

Description Amr loves Geometry. One day he came up with a very interesting problem. Amr has a circle of radius r and center in point (x, y). He wants the circle center to be in new position (x, y). In one step Amr can put a pin to the border of the circl…

TCP/IP学习

http://blog.csdn.net/column/details/15153.html?

ngnix 作用(通俗易懂)【转载】

作者&#xff1a;RayeWang www.raye.wang/2017/02/24/quan-mian-liao-jie-nginxdao-di-neng-zuo-shi-yao/ 前言 本文只针对Nginx在不加载第三方模块的情况能处理哪些事情&#xff0c;由于第三方模块太多所以也介绍不完&#xff0c;当然本文本身也可能介绍的不完整&#xff0…

C++11并发实战(专栏)

http://blog.csdn.net/column/details/ccia.html?&page2

LCIS

Problem DescriptionAlex has two sequences a_1,a_2,...,a_na​1​​,a​2​​,...,a​n​​ and b_1,b_2,...,b_mb​1​​,b​2​​,...,b​m​​. He wants find a longest common subsequence that consists of consecutive values in increasing order. InputThere are mu…

TimeUnit.SECONDS.sleep()和sleep区别

刚看到TimeUnit.SECONDS.sleep()方法时觉得挺奇怪的&#xff0c;这里怎么也提供sleep方法&#xff1f; public void sleep(long timeout) throws InterruptedException {if (timeout > 0) {long ms toMillis(timeout);int ns excessNanos(timeout, ms);Thread.sleep(ms, …

c++11并发指南系列

https://www.cnblogs.com/haippy/archive/2013/08/27/3284540.html

hashmap另一种初始化

代码&#xff1a; new HashMap<String,Integer>() {{put("a", 0);put("b", 0);put("c", 0);}}; 用处&#xff1a; for (Entry<String, String> entry : set) {value entry.getValue();try {if(k 5) {break;}json new JSONObjec…

怎么去阅读这本书

最近打算对并发编程和网络编程进行一定深度的学习&#xff0c;