C++ AOP前置逻辑与后置逻辑的注入
核心原理
在宏处,将用户写的函数名进行改名
然后新增原先的同名函数
该函数的逻辑为执行前置逻辑,调用改名的函数,执行后置逻辑
用户在调用函数时就会调用成我们的替换版本
RAII机制:
通过在前置逻辑中构造一个临时对象
通过编写该对象的构造函数和析构函数
实现无需触碰宏逻辑,只需要写这个临时对象的逻辑即可
也能无需专门在调用改名之后的函数之后,编写后置逻辑
声明与实现
#ifndef AOP_INJECTION_H
#define AOP_INJECTION_H
//前置逻辑与后置逻辑RAII机制
class Cpu {
public:
// 构造函数:对象创建时输出前置日志
Cpu() { std::cout << "[前置] CPU密集任务开始" << std::endl; }
// 析构函数:对象销毁时输出后置日志
~Cpu() { std::cout << "[后置] CPU密集任务结束" << std::endl; }
};
//声明宏,用于普通函数声明
#define CPU_DECL(name) \
template <typename... Args> \
auto name(Args... args); \
auto name##_t
//定义宏,用于普通函数与类成员函数定义
#define CPU_IMPL(name) \
template <typename... Args> \
auto name(Args... args) { \
Cpu cpu; \
return name##_t(args...); \
} \
auto name##_t
#endif
使用示例
#include <iostream>
#include "AOPinjection.h"
//因为底层是模板,所以声明和定义不能跨文件分离
//普通函数:先声明,后定义
CPU_DECL(add)(int a, int b)->void;
CPU_IMPL(add)(int a, int b)->void {
std::cout << a + b << std::endl;
}
//类成员函数:直接定义(无需单独声明)
class Calculator {
public:
CPU_IMPL(add)(int a, int b)->void {
std::cout << a + b << std::endl;
}
};
int main() {
std::cout << "普通函数调用" << std::endl;
add(3, 4);
std::cout << std::endl;
Calculator calc;
std::cout << "类成员函数调用" << std::endl;
calc.add(5, 6);
return 0;
}
输出结果
普通函数调用
[前置] CPU密集任务开始
7
[后置] CPU密集任务结束
类成员函数调用
[前置] CPU密集任务开始
11
[后置] CPU密集任务结束

浙公网安备 33010602011771号