### 使用c++11开发一个轻量级的AOP库 AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事务处理 ``` #pragma once #define HAS_MEMBER(member)\ templatestruct has_member_##member\ {\ private:\ template static auto Check(int) -> decltype(std::declval().member(std::declval()...), std::true_type()); \ template static std::false_type Check(...);\ public:\ enum{value = std::is_same(0)), std::true_type>::value};\ };\ HAS_MEMBER(Foo) HAS_MEMBER(Before) HAS_MEMBER(After) #include template struct Aspect : NonCopyable { Aspect(Func&& f) : m_func(std::forward(f)) { } template typename std::enable_if::value&&has_member_After::value>::type Invoke(Args&&... args, T&& aspect) { aspect.Before(std::forward(args)...);//核心逻辑之前的切面逻辑 m_func(std::forward(args)...);//核心逻辑 aspect.After(std::forward(args)...);//核心逻辑之后的切面逻辑 } template typename std::enable_if::value&&!has_member_After::value>::type Invoke(Args&&... args, T&& aspect) { aspect.Before(std::forward(args)...);//核心逻辑之前的切面逻辑 m_func(std::forward(args)...);//核心逻辑 } template typename std::enable_if::value&&has_member_After::value>::type Invoke(Args&&... args, T&& aspect) { m_func(std::forward(args)...);//核心逻辑 aspect.After(std::forward(args)...);//核心逻辑之后的切面逻辑 } template void Invoke(Args&&... args, Head&&headAspect, Tail&&... tailAspect) { headAspect.Before(std::forward(args)...); Invoke(std::forward(args)..., std::forward(tailAspect)...); headAspect.After(std::forward(args)...); } private: Func m_func; //被织入的函数 }; template using identity_t = T; //AOP的辅助函数,简化调用 template void Invoke(Func&&f, Args&&... args) { Aspect asp(std::forward(f)); asp.Invoke(std::forward(args)..., identity_t()...); } /*TEST CODE struct TimeElapsedAspect { void Before(int i) { m_lastTime = m_t.elapsed(); } void After(int i) { cout <<"time elapsed: "<< m_t.elapsed() - m_lastTime << endl; } private: double m_lastTime; Timer m_t; }; struct LoggingAspect { void Before(int i) { std::cout <<"entering"<< std::endl; } void After(int i) { std::cout <<"leaving"<< std::endl; } }; void foo(int a) { cout <<"real HT function: "<(&foo, 1); //织入方法 cout <<"-----------------------"<< endl; Invoke(&foo, 1); return 0; } */ ```