Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103682668
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-04-16 18:50:28

     来源:Blog    作者:fatalerror99

有了这个 class template(类模板),为 Widget 增加 set_new_handler 支持就很容易了:Widget 只需要从 NewHandlerSupport 继承即可。(可能看起来很奇特,但是下面我将解释更多的细节。)

class Widget: public NewHandlerSupport {
 ... // as before, but without declarations for
}; // set_new_handler or operator new

  这些就是 Widget 为了提供一个 class-specific set_new_handler 所需要做的全部。

  但是也许你依然在为 Widget 从 NewHandlerSupport 继承而烦恼。如果是这样,当你注意到 NewHandlerSupport template 从来没有用到它的 type parameter T 时,你可能会更加烦恼。它不需要那样做。我们需要的全部就是为每一个从 NewHandlerSupport 继承的 class 提供一份不同的 NewHandlerSupport ——特别是它的 static data member(静态数据成员)currentHandler ——的拷贝。template parameter T 只是为了将一个 inheriting class 同另一个区分开来。template 机制自己自动地为每一个被实例化的 NewHandlerSupport 中的 T 生成一个 currentHandler 的拷贝。

  对于 Widget 从一个把 Widget 当作一个 type parameter(类型参数)的 templatized base class(模板化基类)继承,如果这个概念把你弄得有点糊涂,不必难受。它最开始对每一个人都有这种影响。然而,它发展成如此有用的一项技术,它有一个名字,虽然它正常看上去所反映的事实并不是他们第一次看到它的样子。它被称作 curiously recurring template pattern(奇特的递归模板模式) (CRTP)。真的。

  在这一点上,我发表了一篇文章建议一个更好的名字叫做 "Do It For Me",因为当 Widget 从 NewHandlerSupport 继承时,它其实是在说:“我是 Widget,而我要从针对 Widget 的 NewHandlerSupport class 继承。”没有人使用我提议的名字(甚至是我自己),但是把 CRTP 考虑成说 "do it for me" 的一种方式也许会帮助你理解 templatized inheritance(模板化继承)在做些什么。

  像 NewHandlerSupport 这样的 templates 使得为任何有需要的 class 添加一个 class-specific new-handler 变得易如反掌。然而,mixin-style inheritance(混合风格继承)总是会导致 multiple inheritance(多继承)的话题,而在我们沿着这条路走下去之前,你需要阅读《C++箴言:谨慎使用多继承》。

阅读(278) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~