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

开发中有时候遇到这种情况:类的某个函数返回时执行一些清理工作,或一些特殊的动作;但是方法中的返回点有很多个,如果在每个返回点都放置清理代码,势必不好的,所以需运用一些技巧;一个可以利用的技巧是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");
}






                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值