利用RAII处理第三方变量

发布时间 2023-03-27 16:36:49作者: flxx
#include <iostream>
#include <functional>

using F1 = std::function<void()>;
using F2 = F1;
template <typename T1, typename T2>
class RAII {
public:
    RAII(T1 t1, T2 t2) :f1(t1), f2(t2){
        t1();
    }
    ~RAII() {
        f2();
        f1 = nullptr;
        f2 = nullptr;
    }
private:
    T1 f1;
    T2 f2;
};

int a{};
F1 f1 = [&a](){a =1; std::cout << a << std::endl;};
F2 f2 = [&a](){a += 3; std::cout << a << std::endl;};

int main()
{
    {
        // RAII<F1, F2> raii(f1, f2);
        // output:
        // 1
        // 4
        // Hello World
    }
    
    // RAII<F1, F2> raii(f1, f2);
    // output:
    // 1
    // Hello World
    // 4
    
    auto *raii = new RAII<F1, F2>(f1, f2);
    delete raii;
    // output:
    // 1
    // 4
    // Hello World 
    std::cout << "Hello World" << std::endl;
    return 0;
}