在\trunk\talk\base\scoped_ptr.h文件中的scoped_ptr_impl模板类的reset方法,由于scoped_ptr_impl类的内部定义结构体Data继承自类模板参数D(代表的是指针析构类),并声明成员变量Data data_;Data data_;当调用reset方法时重新赋值指针,先获取到原始指针T* old = data_.ptr;然后如果该指针非空则执行static_cast<D&>(data_)(old);该语句首先将成员变量转换成父类的引用,然后将原始指针作为参数调用其重载的()成员函数。
以其中一个scoped_ptr为例,该模板类第一个类模板参数为T,第二个类模板参数为默认参数talk_base::DefaultDeleter<T>,DefaultDeleter是一个定义在当前文件的模板类或者模板结构体,从名字可知为析构类,以模板类scoped_ptr中定义的成员变量talk_base::internal::scoped_ptr_impl<element_type, deleter_type> impl_;为例,使用的是template <class T> struct DefaultDeleter模板而非其他两个重载的DefaultDeleter,而这个模板又传递给talk_base::internal::scoped_ptr_impl模板类成为其第二个类模板参数,由上分析该模板类型会是scoped_ptr_impl内部定义的结构体Data的父类,而且scoped_ptr_impl模板类的reset方法中执行用static_cast<D&>(data_)(old);时即template <class T> struct DefaultDeleter类的inline void operator()(T* ptr) const方法,该方法中执行delete ptr;即class scoped_ptr模板类的第一个类模板参数的析构函数。