实现原理:
1、利用临时对象做保护
template<class T>
class TempObject {
T* m_ptr;
Lock& m_lock;
public:
TempObject (Lock& lock, T* ptr) : m_ptr(ptr), m_lock(lock) {
m_lock.lock();
}
~TempObject () {
m_lock.unlock();
}
T* operator->() { return m_ptr; }
};
2、转调用为临时对象的调用
template<class T>
class ProxyObject {
T* m_ptr;
Lock m_lock;
public:
ProxyObject (T* t) : m_ptr(t) {}
TempObject operator->() {
TempObject to(m_lock, m_ptr);
return to;
}
};
3、调用
class Test {
...
public:
void fun() {...}
};
Test* pobj = new Test();
ProxyObject<Test> pT;
pT->fun();
// 进行如下转化
// TempObject tmp = pT.operator->() ;
// Test* ptr = tmp.operator->() ;
// ptr ->fun();