⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scopeguard.h

📁 这是本人在工作中积累的VC++类库
💻 H
字号:
/************************************************************************
模快名:		moxu 公共类库
功能:		用于管理对象的生命周期
完成日期:	2007-10-20
作者:		许 培 Xu Pei(Email/MSN: peimoxu@163.com)

本代码可以自由使用,但因使用本代码造成的后果,本人不承担任何责任
************************************************************************/

#pragma once


namespace moxu
{

	namespace detail
	{

		class IScopeGuard
		{
		public:
			virtual ~IScopeGuard(void){ };
		};


		template<typename FUN>
		class ScopeGuard0 : public IScopeGuard
		{
		protected:
			FUN m_fun;

		public:
			ScopeGuard0(FUN fun) : m_fun(fun){ }

			virtual ~ScopeGuard0(){ m_fun(); }
		};


		template<typename FUN, typename P1>
		class ScopeGuard1 : public IScopeGuard
		{
		protected:
			FUN m_fun;
			const P1 m_p1;

		public:
			ScopeGuard1(FUN fun, P1 p1) : m_fun(fun), m_p1(p1){ }

			virtual ~ScopeGuard1(){ m_fun(m_p1); }
		};


		template<typename FUN, typename P1, typename P2>
		class ScopeGuard2 : public IScopeGuard
		{
		protected:
			FUN m_fun;
			const P1 m_p1;
			const P2 m_p2;

		public:
			ScopeGuard2(FUN fun, P1 p1, P2 p2) : m_fun(fun), m_p1(p1), m_p2(p2) { }

			virtual ~ScopeGuard2(){ m_fun(m_p1, m_p2); }
		};


		template<typename FUN, typename P1, typename P2, typename P3>
		class ScopeGuard3 : public IScopeGuard
		{
		protected:
			FUN m_fun;
			const P1 m_p1;
			const P2 m_p2;
			const P3 m_p3;

		public:
			ScopeGuard3(FUN fun, P1 p1, P2 p2, P3 p3) : m_fun(fun), m_p1(p1), m_p2(p2), m_p3(p3) { }

			virtual ~ScopeGuard3(){ m_fun(m_p1, m_p2, m_p3); }
		};


		//////////////////////////////////////////////////////////////////////////

		template<typename PTR>
		class ScopedObject : public IScopeGuard
		{
		private:
			PTR m_ptr;

		public:
			ScopedObject(PTR ptr) : m_ptr(ptr){ }
			~ScopedObject(){ delete m_ptr; }
		};

		template<typename PTR>
		class ScopedArray : public IScopeGuard
		{
		private:
			PTR m_ptr;

		public:
			ScopedArray(PTR ptr) : m_ptr(ptr){ }
			~ScopedArray(){ delete [] m_ptr; }
		};

	}//namespace detail

	//////////////////////////////////////////////////////////////////////////

	typedef detail::IScopeGuard& ScopeGuard;

	template<typename FUN> 
	detail::ScopeGuard0<FUN> MakeGuard(FUN fun)
	{
		return detail::ScopeGuard0<FUN>(fun);
	}


	template<typename FUN, typename P1> 
	detail::ScopeGuard1<FUN, P1> MakeGuard(FUN fun, P1 p1)
	{
		return detail::ScopeGuard1<FUN, P1>(fun, p1);
	}


	template<typename FUN, typename P1, typename P2> 
	detail::ScopeGuard2<FUN, P1, P2> MakeGuard(FUN fun, P1 p1, P2 p2)
	{
		return detail::ScopeGuard2<FUN, P1, P2>(fun, p1, p2);
	}


	template<typename FUN, typename P1, typename P2, typename P3> 
	detail::ScopeGuard3<FUN, P1, P2, P3> MakeGuard(FUN fun, P1 p1, P2 p2, P3 p3)
	{
		return detail::ScopeGuard3<FUN, P1, P2, P3>(fun, p1, p2, p3);
	}


	//////////////////////////////////////////////////////////////////////////

	template<typename PTR>
	detail::ScopedObject<PTR> MakeObjectGuard(PTR ptr)
	{
		return detail::ScopedObject<PTR>(ptr);
	}

	template<typename PTR>
	detail::ScopedArray<PTR> MakeArrayGuard(PTR ptr)
	{
		return detail::ScopedArray<PTR>(ptr);
	}

}//namespace moxu


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -