源,这时候我们需要直接访问原始资源。
这时候需要一个函数可将RAII对象(如tr1::shared_ptr)转换为其所内含之原始资源。有两种做法可以达成目
标:显示转换和隐式转换。
tr1::shared_ptr和auto_ptr都提供一个get成员函数,用来执行显示转换,也就是返回智能指针内部的原始指针
(的复件)。就像所有智能指针一样, tr1::shared_ptr和auto_ptr也重载了指针取值操作(operator>和operator*),
它们允许隐式转换至底部原始指针。(即在对智能指针对象实施->和*操作时,实际被转换为被封装的资源的指针。)
class Font
{
public:
...
FontHandle get() const //FontHandle 是资源; 显示转换函数
{
return f;
}
operator FontHandle() const //隐式转换 这个值得注意,可能引起“非故意之类型转换”
{
return f;
}
...
};
是否该提供一个显示转换函数(例如get成员函数)将RAII类转换为其底部资源,或是应该提供隐式转换,答案主
要取决于RAII类被设计执行的特定工作,以及它被使用的情况。
显示转换可能是比较受欢迎的路子,但是需要不停的get,get;而隐式转换又可能引起“非故意之类型转换”。
请记住:
APIs往往要求访问原始资源,所以每一个RAII类应该提供一个“取得其所管理之资源”的方法。
对原始资源的访问可能经由显示转换或隐式转换。一般而言显示转换比较安全,但隐式转换对客户比较方便。