|
热门文章
推荐文章
最新文章
|
C++箴言:用成员函数模板接受兼容类型(2)
原作者:kuku 添加时间:2007-06-02 原文发表:2007-06-02 人气:8 来源:互联网
本文章共4866字,分4页,当前第2页,快速翻页:
|
public:
template // member template
SmartPtr(const SmartPtr & other); // for a "generalized
... // copy constructor"
};
这就是说对于每一种类型 T 和每一种类型 U,都能从一个 SmartPtr 创建出一个 SmartPtr ,因为 SmartPtr 有一个取得一个 SmartPtr 参数的 constructor(构造函数)。像这样的 constructor(构造函数)——从一个类型是同一个 template(模板)的不同实例化的 object 创建另一个 object 的 constructor(构造函数)(例如,从一个 SmartPtr 创建一个 SmartPtr )——有时被称为 generalized copy constructors(泛型化拷贝构造函数)。
上面的 generalized copy constructor(泛型化拷贝构造函数)没有被声明为 explicit(显式)的。这是故意为之的。built-in pointer types(内建指针类型)之间的类型转换(例如,从派生类指针到基类指针)是隐式的和不需要 cast(强制转型)的,所以让 smart pointers(智能指针)模仿这一行为是合理的。在 templatized constructor(模板化构造函数)中省略 explicit 正好做到这一点。
作为声明,SmartPtr 的 generalized copy constructor(泛型化拷贝构造函数)提供的东西比我们想要的还多。是的,我们需要能够从一个 SmartPtr 创建一个 SmartPtr ,但是我们不需要能够从一个 SmartPtr 创建一个 SmartPtr ,这就像颠倒 public inheritance(公有继承)的含义(参见《 C++箴言:确保公开继承模拟“is-a” 》)。我们也不需要能够从一个 SmartPtr 创建一个 SmartPtr ,因为这和从 int* 到 double* 的 implicit conversion(隐式转换)是不相称的。我们必须设法过滤从这个 member template(成员模板)生成的 member functions(成员函数)的群体。
假如 SmartPtr 跟随 auto_ptr 和 tr1::shared_ptr 的脚步,提供一个返回被这个 smart pointer(智能指针)持有的 built-in pointer(内建指针)的拷贝的 get member function(get 成员函数)(参见《 C++箴言:在资源管理类中准备访问裸资源 》),我们可以用 constructor template(构造函数模板)的实现将转换限定在我们想要的范围: template
class SmartPtr {
public:
template
SmartPtr(const SmartPtr & other) // initialize this held ptr
: heldPtr(other.get()) { ... } // with other's held ptr
T* get() const { return heldPtr; }
...
private: // built-in pointer held
T *heldPtr; // by the SmartPtr
};
我们通过 member initialization list(成员初始化列表),用 SmartPtr 持有的类型为 U* 的指针初始化 SmartPtr 的类型为 T* 的 data member(数据成员)。这只有在“存在一个从一个 U* 指针到一个 T* 指针的 implicit conversion(隐式转换)”的条件下才能编译,而这正是我们想要的。最终的效果就是 SmartPtr 现在有一个 generalized copy constructor(泛型化拷贝构造函数),它只有在传入一个 compatible type(兼容类型)的参数时才能编译。
member function templates(成员函数模板)的用途并不限于 constructors(构造函数)。它们的另一个常见的任务是用于支持 assignment(赋值)。例如,TR1 的 shared_ptr(再次参见《 C++箴言:使用对象管理资源 》)支持从所有兼容的 built-in pointers(内建指针),tr1::shared_ptrs,auto_ptrs 和 tr1::weak_ptrs构造,以及从除 tr1::weak_ptrs 以外所有这些赋值。这里是从 TR1 规范中摘录出来的一段关于 tr1::shared_ptr 的内容,包括它在声明 template parameters(模板参数)时使用 class 而不是 typename 的偏好。(就像《 C++箴言:理解typename的两个含义 》中阐述的,在这里的上下文环境中,它们的含义严格一致。) template class shared_ptr { 本文章更多内容:<<上一页 - 1 - 2 - 3 - 4 - 下一页>> |
 本文章所属分类: 首页
→ 推荐教程
→ C++C语言
C++C语言
|
文章搜索
|