在C++中对指针运算符->的重载的运用很多,比如在STL、Boost、ATL库中很多功能都是通过对->的重载实现。
下面要介绍的是重载指针运算符实现前调用及后调用(Pre and Post function calls)。该功能的应用主要是基于 指针运算符的一个及其特殊且及其重要的机制:当你对某个型别实施operator-〉而这个型别并非原生指针(原生指针就是最简单最基本那一种,如type* p)时候,编译器会从这个型别中找出用户自定义的 operator-〉并实施后,编译器将继续对这个operator-〉返回的结果实施 operator-〉直到找到一个原生指针。
如下代码应用:
class Guard
{
public:
Guard(){};
virtual ~Guard(){};
virtual int Acquire()
{
}
virtual void Release()
{
}
virtual void Lock()
{
std::cout << "Lock" << std::endl;
}
virtual void UnLock()
{
std::cout << "UnLock" << std::endl;
}
};
template<class T, class GuardPolicy = Guard>
class MultiThreadCall
{
public:
class LockProxy
{
public:
LockProxy(T* pT, GuardPolicy* pGuard)
:m_pT(pT)
,m_pGuard(pGuard)
{
m_pGuard->Lock();
}
~LockProxy()
{
m_pGuard->UnLock();
}
T* operator ->()
{
return m_pT;
}
protected:
T* m_pT;
GuardPolicy* m_pGuard;
};
MultiThreadCall(T* pT)
:m_pT(pT)
{
}
MultiThreadCall(T& t)
:m_pT(&t)
{
}
LockProxy operator ->()
{
return LockProxy(m_pT, &m_Guard);
}
protected:
T* m_pT;
GuardPolicy m_Guard;
};
MultiThreadCall类实现了在多线程环境下安全调用函数方法的功能。
如我们有一个ActionClass类
class ActionClass
{
public:
void DoAction()
{
std::cout << "DoAction" << std::endl;
}
};
该类的DoAction方法在单线程环境下无问题,现在需增加多线程环境下的安全调用,那么利用上面的Adapter类就可以实现,如:
//1、single thread
ActionClass actionObj;
actionObj.DoAction();
//output: DoAction
//2、multi thread
ActionClass actionObj;
MultiThreadCall<ActionClass> multiCall(&actionObj);
multiCall->DoAction();
//output: Lock
DoAction
UnLock
如上的MultiThreadCall类就实现了前调用和后调用功能,该类通过一些简单改超即可应用于实际的Project中(实现GuardPolicy等)。