c++ 面向切面变成 aop 通用模板
来源:互联网 发布:淘宝上冰毒暗语 编辑:程序博客网 时间:2024/06/07 02:05
#ifndef AOP_h#define AOP_h#define HAS_MEMBER(member)\template<typename T, typename... Args>struct has_member_##member\{\private:\template<typename U> static auto Check(int) -> decltype(std::declval<U>().member(std::declval<Args>()...), std::true_type()); \template<typename U> static std::false_type Check(...);\public:\enum{value = std::is_same<decltype(Check<T>(0)), std::true_type>::value};\};\HAS_MEMBER(Foo)HAS_MEMBER(Before)HAS_MEMBER(After) template<typename Func, typename... Args>struct Aspect {Aspect(Func&& f) : m_func(std::forward<Func>(f)){}template<typename T>typename std::enable_if<has_member_Before<T, Args...>::value&&has_member_After<T, Args...>::value>::type Invoke(Args&&... args, T&& aspect){aspect.Before(std::forward<Args>(args)...);//核心逻辑之前的切面逻辑m_func(std::forward<Args>(args)...);//核心逻辑aspect.After(std::forward<Args>(args)...);//核心逻辑之后的切面逻辑}template<typename T>typename std::enable_if<has_member_Before<T, Args...>::value&&!has_member_After<T, Args...>::value>::type Invoke(Args&&... args, T&& aspect){aspect.Before(std::forward<Args>(args)...);//核心逻辑之前的切面逻辑m_func(std::forward<Args>(args)...);//核心逻辑}template<typename T>typename std::enable_if<!has_member_Before<T, Args...>::value&&has_member_After<T, Args...>::value>::type Invoke(Args&&... args, T&& aspect){m_func(std::forward<Args>(args)...);//核心逻辑aspect.After(std::forward<Args>(args)...);//核心逻辑之后的切面逻辑}template<typename Head, typename... Tail>void Invoke(Args&&... args, Head&&headAspect, Tail&&... tailAspect){headAspect.Before(std::forward<Args>(args)...);Invoke(std::forward<Args>(args)..., std::forward<Tail>(tailAspect)...);headAspect.After(std::forward<Args>(args)...);}private:Func m_func; //被织入的函数};template<typename T> using identity_t = T;//AOP的辅助函数,简化调用template<typename... AP, typename... Args, typename Func>void Invoke(Func&&f, Args&&... args){Aspect<Func, Args...> asp(std::forward<Func>(f));asp.Invoke(std::forward<Args>(args)..., identity_t<AP>()...);}#endif // !AOP_h
1 0
- c++ 面向切面变成 aop 通用模板
- 面向切面变成AOP
- AOP,面向切面编程
- AOP面向切面编程
- 面向切面编程 (AOP)
- AOP--面向切面编程
- AOP面向切面编程
- AOP面向切面编程
- AOP面向切面编程
- AOP面向切面编程
- AOP 面向切面编程
- AOP面向切面编程
- 面向切面编程AOP
- AOP面向切面编程
- AOP面向切面编程
- 【Spring】AOP - 面向切面
- AOP面向切面编程
- AspectJ Aop 面向切面
- GCD入门介绍三----线程死锁
- CSS-float浮动与流体布局(2)
- SQLAlchemy:python数据库连接 神器
- 3.MR输入格式和分片相关
- spfa ,就邻接表建图模板
- c++ 面向切面变成 aop 通用模板
- iOS-上传错误之ERROR ITMS-90535 Unexpected CFBundleExecutable Key. 的解决办法
- 单线程无锁读写缓存
- 创建显示对话框的DLL
- extjs 事件参数,不加,就要使用绝对引用
- 5.MR多文件的输入输出
- 理解jquery的$.extend()、$.fn和$.fn.extend()
- springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序
- 4.MR老版流程源码解析