退出作用域时自动调用指定代码

来源:互联网 发布:cnmd是什么意思网络 编辑:程序博客网 时间:2024/06/05 06:09

问题

在编程过程中,尝尝希望在退出某个作用域时(如函数返回)执行制定的代码。
如果退出作用域的地方有多处则需要在每个地方都添加相应的代码,这样不但麻烦也容易遗漏。

解决思路

由于C++中当在作用域中创建的对象在退出作用域时会自动调用对象的析构函数,所以可以利用这个特性实现“退出作用域时自动调用制定代码”。

本来希望能在标准库或boost库中直接找到相关的功能,但可惜没有找到,所以就自己动手。其中存在的不足还请各位大神指正。

解决方法

示例代码

#include <iostream>template<typename T>class CAutoCall{public:    CAutoCall(T fun) { m_pFun = fun; };    ~CAutoCall() { m_pFun();  };private:    T m_pFun;};class CFunObj{public:    CFunObj() : m_nA(0), m_nB(0) {};    void operator() () { std::cout << m_nA + m_nB << std::endl; };public:    int m_nA;    int m_nB;};int main(){       CAutoCall<void(*)()> objTemp([]() { std::cout << "Implement" << std::endl; });    CFunObj funObj;    funObj.m_nA = 1;    funObj.m_nB = 2;    {        CAutoCall<decltype(funObj)> objTemp1(funObj);    }    return 0;}

运行结果

3
Implement

代码分析

CAutoCall采用模板类的方式扩大其应用范围,示例代码中它既可以接收函数指针也可以接收函数对象。

使用函数对象比使用函数指针更灵活,能完成更复杂的操作。