📄 scopeguard.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 + -