has_member.h:
#ifndef __AOP_SRC_HAS_MEMBER_H__
#define __AOP_SRC_HAS_MEMBER_H__
#include <type_traits>
#define HAS_MEMBER_FUNCTION(member) \
template<typename T, typename ... Args> \
struct has_member_##member \
{ \
private: \
template<typename U> \
static auto test(void*) -> decltype(std::declval<U>().member(std::declval<Args>()...), std::true_type()); \
\
template<typename U>\
static std::false_type test(...);\
\
public:\
static const bool value = decltype(test<T>(nullptr))::value;\
};
#endif
macros.h:
#ifndef __AOP_MACROS_H__
#define __AOP_MACROS_H__
#define AOP_NAMESPACE_BEGIN namespace aop {
#define AOP_NAMESPACE_END }
#endif
aspect.h:
#ifndef __AOP_SRC_ASPECT_H__
#define __AOP_SRC_ASPECT_H__
#include "has_member.h"
#include "macros.h"
AOP_NAMESPACE_BEGIN
HAS_MEMBER_FUNCTION(Before);
HAS_MEMBER_FUNCTION(After);
template<typename Func, typename... Args>
struct Aspect
{
Aspect(Func&& func) : func_(std::forward<Func>(func)) {}
Aspect(const Aspect&) = delete;<