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密集任务结束

posted @ 2026-04-07 20:11  SINGLERS  阅读(2)  评论(0)    收藏  举报