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