您的位置:学习中国 推荐教程 C++C语言 正文
原作者: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++的秘密之详解extern C
C++箴言:为类型信息使用特征类
创建可移植的64位应用程序代码
设计OutLook风格的工具栏
C++程序员必需的修养
如何编写异常安全的C++代码
在c++程序中重启自己的一种方法
踏入C++中的雷区——C++内存管理详解
C++的救赎 C++开源程序库评话
初学者必备:C++经典入门详细教程
C++之父Bjarne谈C++中的STL模板
对象布局及多态探索之菱形结构虚继承
如何访问模板化基类中的名字
C++对象布局及多态之虚成员函数调用
理解隐式接口和编译期多态
C++程序中导出Word文档简易方法
C++程序设计从零开始之语句
对象布局及多态实现之成员函数的调用
C++箴言:谨慎使用私有继承
C++编程人员容易犯的10个C#错误

相关评论


本文章所属分类:首页 推荐教程 C++C语言   C++C语言