机制说明
编译器可以对一个->表达式多次应用operator->,直到找到原始指针。
例子
好用的RAII手法
template<typename T>
struct LockingProxy
{
LockingProxy(T* pObj) : pointee_ (pObj )
{
pointee_->lock();
}
~LockingProxy()
{
pointee_->unlock();
}
T* operator->() const
{
return pointee_;
}
LockingProxy& operator=(const LockingProxy&) = delete;
private:
T* pointee _;
};
另一个类的实现:
template<typename T>
class SmartPtr
{
// ...
LockingProxy<T> operator->() const
{
return LockingProxy<T>(pointee_);
}
private:
T* pointee_;
};
可以看出以上两个类都实现了operator->。 使用:
SmartPtr<Widget> sp = new Widgetl
sp->doSomething();
技巧说明: SmartPtr的operator->传回一个LockingProxy<T>临时对象。编译器继续施行operator->,LockingProxy的operator->传回Widget*。编译器通过这个sp指针调用doSomething ()。调用期间,LockingProxy<T>临时对象处于活跃状态并锁定Widget对象;即对象被安全锁定了。一旦 doSomething()返问,LockingProxy<T>临时对象被摧毁,Widget对象也随之解锁(RAII)。
总结
上面实现是一种自动锁定技术。
|