类成员函数的函数对象与RIIA结合在多返回点函数中的应用

时间:2022-06-07 18:55:30

开发中有时候遇到这种情况:类的某个函数返回时执行一些清理工作,或一些特殊的动作;但是方法中的返回点有很多个,如果在每个返回点都放置清理代码,势必不好的,所以需运用一些技巧;一个可以利用的技巧是C++的RIIA,具体就是编写一个模板类,在类析构的时候执行特定的方法;

代码如下:

template<typename T, typename F>
class CClassFun
{
	public:	
		CClassFun(T* p, F f)
		: m_p(p)
		, m_f(f)
		{
			
		}
		~CClassFun()
		{
		}
		void operator()()
		{
			(m_p->*m_f)();
		}
		
	protected:
		T* m_p;
		F  m_f;	
};

template<typename F>
class CAutoRunClassFun
{
public:
	CAutoRunClassFun(F f)
		      : m_f(f)
		      {
		         
          };
	~CAutoRunClassFun(){
			m_f();
        };
protected:
	F     m_f;
};

测试:
class CTest
{
    public:
        CTest(){};
        ~CTest(){};
        
        void Print()
        {
            printf("hello world\n");
        }
        
        void Test()
        {
             CClassFun<CTest, void (CTest::*)()> theFun(this, &CTest::Print);
                 
             CAutoRunClassFun< CClassFun<C_Test, void (CTest::*)()> > theOperation(theFun);
             
        }

};


int main()
{
    CTest   a;
    a.Test()

return 0;
} 

如果用boost,代码会大大简化,如下:
class AutoRelease
{
public:
    AutoRelease(boost::function<void()> f):f_(f)
    {
    }
    ~AutoRelease()
    {
        f_();
    }

private:
    boost::function<void()> f_;
};

class CTest
{
    public:
        CTest(){};
        ~CTest(){};
        
        void Print()
        {
            printf("hello world\n");
        }
        
        void Test()
        {
            AutoRelease autoR(boost::bind(&CTest::Print,this));
        }

}; 

int main() {

    CTest   a;
    a.Test();

    system("pause");
}