本文主要是介绍类成员函数的函数对象与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"); }
这篇关于类成员函数的函数对象与RIIA结合在多返回点函数中的应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!