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